我有点困惑。我有一个类animal
,假设它存储诸如位置等基本信息。因此,我有了一个扩展了smartAnimal
的类animal
。假设smartAnimal
添加了一些无需用户输入即可进行决策的功能。
现在,我有一个扩展了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代理控制它,其功能都相同。
最佳答案
答案是,这不是一个现实的继承层次结构,您可以从使用“添加某些功能”一词来描述子类中的添加方法这一事实中看出来。这不是正确的继承。在适当的继承中(至少在Java中),每个方法都应存在于继承层次结构的顶层。继承用于代码重用,而不是用于在深入树中时添加功能。因此,给出的问题实际上没有答案。
关于java - Java中正确的继承体系结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15058079/