【问题标题】:java inheritance and design patterns advisesjava继承和设计模式建议
【发布时间】:2019-09-23 08:51:21
【问题描述】:

我在 Android 中做一个可以运行不同 ML 模型的应用程序,我想创建一些类来表示结果的数据,每个 ML 模型都有它自己的变量/结果,例如,一个分类问题同时有标签其他没有。

我想在 java 中使用继承,并做类似 Result 作为接口和 ClassificationResultRegresionResult 的父亲,所以我可以这样做:

Arraylist<Result> resultList;
ClassificationResult cr = new ClassificationResult...
RegresionResult rr = new RegresionResult...
resultList.add(cr)
resultList.add(rr)  

但是我面临的问题是我不能从孩子那里调用方法,比如 ClassificationResult.getLabels()(我可以在界面中拥有所有孩子的所有方法,但对我来说似乎很奇怪)

我看到了一些模式,Factory 和 Builder,但我遇到了前面描述的 Factory 模式和 Builder(将所有变量放在一个类中)的问题,其中大多数都不会被初始化。

我会很感激一些关于我应该如何设计这个的想法

【问题讨论】:

  • 查看我关于多态性的帖子,我认为this 会对您有所帮助
  • 是的,我完全理解您的帖子,但例如,如果您想为Circle 添加更多功能,例如getPositionCentre(),该方法不在Shape 中,因此您无法调用它。 @Alireza Bideli
  • 你可以将你的对象转换成 Circle,然后调用它的方法@JMP
  • @AlirezaBideli 或者他可以将他的对象投射到Duck 并调用它的quack() 方法:) 然后捕获ClassCastException,如果被捕获,告诉用户“你的鸭子已经煮熟了并且不再支持嘎嘎声”:)

标签: java design-patterns class-hierarchy


【解决方案1】:

如果它看起来像鸭子,叫起来像鸭子,但它需要电池,那么你可能有错误的抽象。

(在互联网上搜索此短语并阅读您会找到的文章。)

也就是说,当你不知道如何区分对象时,不要将它们视为单个接口的不同规范。

除非你实现一个低级框架,如果你想使用instanceof,或者——更好的说法——如果使用instanceof是区分你的对象的唯一方法,很可能你的设计是错误的一开始。

考虑一下你的对象真正 有什么共同点。仅当您找到任何东西时,将其设为接口方法并让您的每个对象实现它。

如果您是动物学家,您可以将 dogscats 视为单个界面的子类型。如果你是盲人并且需要guide dog,那么这两个是完全不同的类。

【讨论】:

  • 您好,谢谢您的回复,我想我明白您的意思,我应该有不同的类(没有继承),因为它们的行为不同,我想我会使用泛型类。 @Honza Zidek
  • @JMP 他们不必共享相同的行为,但不同的行为应该共享一些共同点。狗吠和猫喵喵叫,这是非常不同的行为,但两者都可以回答同一个问题“动物怎么样?”。如果您为“相同”操作找到一个好的自然名称,那么它就是相同的接口。
猜你喜欢
  • 1970-01-01
  • 2019-07-20
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2017-02-11
相关资源
最近更新 更多