我有点困惑。我有类animal
,假设它存储位置等基本的东西。那么我有一个类smartAnimal
,延伸animal
。假设smartAnimal
增加了一些功能,可以在没有用户输入的情况下做出决定。Java中正确的继承体系结构
现在,我有一个类dog
,延伸animal
。它不延伸smartAnimal
,因为它不需要该功能。到目前为止,我很好:dog
是animal
和smartAnimal
是animal
。但现在我想要smartDog
即将延伸smartAnimal
但smartDog
也应该是dog
。例如,很多常规dog
中的功能,比如说.sniff()
,.poop()
和.bark()
也应该在我的smartDog
中,但除非我直接复制粘贴代码,否则它不会被执行,因为Java不允许多重继承。
成分似乎不雅,因为如果我有:
class smartDog{ smartAnimal thisSmartAnimal; dog thisDog; }
...我会在animal
被复制的 “东西”,比如,例如,位置。我将不得不处理两组位置变量!并在animal
有任何财产的重复。
继承多个接口听起来并不像正确的解决办法,因为我们说dog
是一个接口,.sniff()
,.poop()
和.bark()
的实施不应该改变和smartDog
和任何重新实现其他职业。
这里最好的做法是什么?也就是说,要同时拥有类dog
和smartDog
?
编辑:
从一些评论/答案,让我澄清。在我的具体项目中,一个smartAnimal
实际上有一个完整的神经网络来控制它。这是很多代码,将它抽象到一个接口是没有意义的。 NN功能的核心无论是什么动物都具有相同的功能,但每个smartAnimal
子类都会以不同的方式实现AI“大脑”的输出。相反,每个动物拥有自己的功能,无论人控制它还是自己的AI代理控制它,它们的操作都是相同的。
'smartDog'应该延伸'狗' – 2013-02-24 23:44:14
但是我仍然处于相同的情况,反之亦然,不得不复制+粘贴'smartAnimal'功能到'smartDog'中... – honkbert 2013-02-24 23:49:47
哦,我得到了现在,在Java SE中很难,在使用Scala或IoC模式时更加简单。 – 2013-02-24 23:54:02