Java继承和设计模式建议。

3

我正在开发一款Android应用程序,可以运行不同的机器学习模型。我想创建一些类来表示结果的数据,每个机器学习模型都有自己的变量/结果,例如分类问题具有标签而其他问题则没有。

我想在Java中使用继承,实现像Result这样的接口作为ClassificationResultRegresionResult的父类,如下所示:

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

但是我遇到了一个问题,就是我不能像ClassificationResult.getLabels()这样从子类中调用方法(我可以将所有子类的方法都放在接口中,但这对我来说似乎很奇怪)

我看到一些设计模式,比如工厂和建造者,但是我在使用工厂模式时遇到了上述问题,并且使用建造者模式时(将所有变量放在一个类中),大多数变量不会被初始化。

我希望能够得到一些关于我应该如何设计的想法。


1
看一下我的帖子,它是关于多态性的。我觉得这个链接会对你有帮助:点击此处 - Alireza Bideli
是的,我完全理解你的帖子,但是举个例子,如果您想要为Circle添加更多功能,例如getPositionCentre()方法不在Shape中,因此您无法调用它。@Alireza Bideli - JMP
你可以将你的对象转换为Circle类型,然后调用它的方法。@JMP - Alireza Bideli
1
@AlirezaBideli 或者他可以将对象转换为 Duck 并调用其 quack() 方法 :) 然后捕获 ClassCastException,如果捕获到,则告诉用户 "你的鸭子已经煮熟了,不再支持嘎嘎叫声" :) - Honza Zidek
1个回答

4
如果它看起来像一只鸭子,嘎嘎叫起来也像一只鸭子,但它需要电池,那么你可能选错了抽象层次。换句话说,当你不知道如何区分对象时,不要将它们视为单个接口的不同规格。
除非你实现一个底层框架,否则如果你觉得使用instanceof很诱人,或者更好地说,如果使用instanceof是区分你的对象的唯一方法,那么很可能你的设计从一开始就是错误的。
相反,思考一下你的对象实际上共同拥有什么。只有找到任何共同点,才将其作为接口方法,并让每个对象都实现它。
如果你是一位动物学家,你可以将狗和猫视为单个接口的子类型。如果你是盲人,需要导盲犬,那么这两种动物是完全不同的类别。

你好,感谢您的回复。我明白您的意思了,我应该使用不同的类(没有继承关系),因为它们没有共享相同的行为。我想我会选择通用类。@Honza Zidek - JMP
@JMP 它们不必共享相同的行为,但是不同的行为应该分享某些共同点。狗会叫,猫会喵喵叫,这是非常不同的行为,但两者都可以回答同一个问题“动物怎么走?”如果你能找到一个好的自然名称来描述“相同”的行为,那么它就是相同的接口。 - Honza Zidek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接