我有点困惑。我有一个类animal,假设它存储诸如位置等基本信息。因此,我有了一个扩展了smartAnimal的类animal。假设smartAnimal添加了一些无需用户输入即可进行决策的功能。

现在,我有一个扩展了dog的类animal。它不扩展smartAnimal,因为它不需要该功能。到目前为止,我还不错:doganimal,而smartAnimalanimal。但是现在我想要smartDog可以扩展smartAnimal,但是smartDog也应该是dog。例如,常规dog中的许多功能(例如.sniff().poop().bark())也应包含在我的smartDog中,但是除非我确实复制并粘贴代码,否则这些功能就不会存在。 ,因为Java不允许多重继承。

合成似乎不太优雅,因为如果我有:

class smartDog{ smartAnimal thisSmartAnimal; dog thisDog; }

...我将在animal中复制“内容”,例如位置。我将不得不处理两组位置变量!并且animal中存在任何属性的重复项。

继承多个接口也听起来不像是正确的解决方案,因为假设dog是一个接口,.sniff().poop().bark()的实现不必改变并且可以重新实现smartDog和其他任何类。

最佳做法是什么?也就是说,要同时具有dogsmartDog两个类吗?

编辑:

从一些评论/答案中,让我澄清一下。在我的特定项目中,smartAnimal实际上具有控制它的整个神经网络。这是很多代码,并且将其抽象到接口没有任何意义。 NN功能的核心是相同的,无论动物是什么动物,但是每个smartAnimal子类将以不同的方式实现AI“大脑”的输出。相反,每只动物都有自己的功能,无论是人类控制它还是由自己的AI代理控制它,其功能都相同。

最佳答案

答案是,这不是一个现实的继承层次结构,您可以从使用“添加某些功能”一词来描述子类中的添加方法这一事实中看出来。这不是正确的继承。在适当的继承中(至少在Java中),每个方法都应存在于继承层次结构的顶层。继承用于代码重用,而不是用于在深入树中时添加功能。因此,给出的问题实际上没有答案。

关于java - Java中正确的继承体系结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15058079/

10-15 10:40