我有点进退两难。我有 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子类都会以不同的方式实现人工智能“大脑”的输出。相反,每只动物都有自己的功能,无论是人类控制它还是它自己的人工智能代理控制它,它们的功能都是一样的。