java - Java 中正确的继承体系结构

标签 java inheritance design-principles

我现在有点进退两难。我有一个 animal 类,假设它存储位置等基本信息。那么我有一个扩展 animalsmartAnimal 类。假设 smartAnimal 添加了一些无需用户输入即可做出决策的功能。

现在,我有一个扩展 animaldog 类。它不会扩展 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 和任何其他类进行改变和重新实现>.

这里的最佳实践是什么?也就是说,同时拥有 dogsmartDog 类?

编辑:

根据一些评论/答案,让我澄清一下。在我的具体项目中,smartAnimal 实际上有一个完整的神经网络来控制它。这是很多代码,将其抽象为接口(interface)是没有意义的。无论哪种动物,神经网络功能的核心都是相同的,但每个 smartAnimal 子类都会以不同的方式实现 AI“大脑”的输出。相反,每种动物都有自己的功能,无论是人类控制它还是它自己的人工智能代理控制它,其操作都是相同的。

最佳答案

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

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

相关文章:

c# - 如何防止修改继承的属性?

Java - 我应该使用字段还是类来解决问题,如下所示 :

c++ - 循环条件的计算

java - 将 double 值转换为字符串后如何从中删除小数点

java - 如何在java中创建 "overrideable"配置?

java - JFrame 正在加载音乐正在运行

java - 在扫雷游戏中显示所有空间

ruby - Ruby Mixin-多重继承

java - 强制调用父类中的特定构造函数