我现在有点进退两难。我有一个 animal
类,假设它存储位置等基本信息。那么我有一个扩展 animal
的 smartAnimal
类。假设 smartAnimal
添加了一些无需用户输入即可做出决策的功能。
现在,我有一个扩展 animal
的 dog
类。它不会扩展 smartAnimal
因为它不需要该功能。到目前为止我还不错:dog
是一种animal
,而smartAnimal
是一种animal
。但现在我想要 smartDog
能够扩展 smartAnimal
,但 smartDog
也应该是一只 dog
。例如,常规 dog
中的许多功能,例如 .sniff()
、.poop()
和 。 bark()
也应该在我的 smartDog
中,但除非我逐字复制+粘贴代码,否则它不会出现,因为 Java 不允许多重继承。
构图看起来不优雅,因为如果我有:
类 smartDog{
smartAnimal thisSmartAnimal;
狗这个狗; }
...我会复制 animal
中的“东西”,例如位置。我必须处理两组位置变量!以及animal
中任何属性的重复。
继承多个接口(interface)听起来也不像正确的解决方案,因为假设 dog
是一个接口(interface),.sniff()
、.poop()
和 .bark()
的实现不必为 smartDog
和任何其他类进行改变和重新实现>.
这里的最佳实践是什么?也就是说,同时拥有 dog
和 smartDog
类?
编辑:
根据一些评论/答案,让我澄清一下。在我的具体项目中,smartAnimal
实际上有一个完整的神经网络来控制它。这是很多代码,将其抽象为接口(interface)是没有意义的。无论哪种动物,神经网络功能的核心都是相同的,但每个 smartAnimal 子类都会以不同的方式实现 AI“大脑”的输出。相反,每种动物都有自己的功能,无论是人类控制它还是它自己的人工智能代理控制它,其操作都是相同的。
最佳答案
答案是,这不是一个现实的继承层次结构,您可以从您使用“添加一些功能”一词来描述在子类中添加方法的事实中看出这一点。这不是正确的继承。在正确的继承中(至少在 Java 中),每个方法都应该存在于继承层次结构的顶层。继承是为了代码重用,而不是为了在深入树时添加功能。因此,您所提出的问题并没有真正的答案。
关于java - Java 中正确的继承体系结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15058079/