我有点进退两难。我有 class animal
,假设它存储基本的东西,如位置等。所以我有一个smartAnimal
扩展的类animal
。假设smartAnimal
添加了一些无需用户输入即可做出决策的功能。
现在,我有一个dog
扩展类animal
。它不会扩展smartAnimal
,因为它不需要该功能。到目前为止我很好: adog
是一个animal
并且 asmartAnimal
是一个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
?
编辑:
从一些评论/答案中,让我澄清一下。在我的具体项目中,asmartAnimal
实际上有一个完整的神经网络来控制它。这是很多代码,将其抽象为接口是没有意义的。不管是什么动物,神经网络功能的核心都是一样的,但每个smartAnimal
子类都会以不同的方式实现人工智能“大脑”的输出。相反,每只动物都有自己的功能,无论是人类控制它还是它自己的人工智能代理控制它,它们的功能都是一样的。