Java 多重继承

标签 java oop multiple-inheritance diamond-problem multiple-interface-implem

为了完全理解如何解决 Java 的多重继承问题,我有一个经典问题需要澄清。

假设我有类 Animal 这有子类 BirdHorse 我需要创建一个类 PegasusBirdHorse 扩展而来,因为 Pegasus 既是鸟又是马。

我认为这是经典的菱形继承(钻石问题)。据我所知,解决这个问题的经典方法是使 AnimalBirdHorse 类接口(interface)并实现 Pegasus 来自他们。

我想知道是否有另一种方法可以解决我仍然可以为鸟和马创建对象的问题。如果有一种方法可以创造动物,那也很棒,但不是必需的。

最佳答案

您可以为动物类(生物学意义上的类)创建接口(interface),例如用于马的 public interface Equidae 和用于鸟类的 public interface Avialae(我不是生物学家,所以这些术语可能是错误的)。

那么你仍然可以创建一个

public class Bird implements Avialae {
}

public class Horse implements Equidae {}

还有

public class Pegasus implements Avialae, Equidae {}

从评论中补充:

为了减少重复代码,您可以创建一个抽象类,其中包含您要实现的动物的大部分通用代码。

public abstract class AbstractHorse implements Equidae {}

public class Horse extends AbstractHorse {}

public class Pegasus extends AbstractHorse implements Avialae {}

更新

我想再补充一个细节。如Brian remarks ,这是OP已经知道的。

但是,我想强调的是,我建议绕过接口(interface)的“多继承”问题,并且我不建议使用已经表示具体类型(例如 Bird)但更多是行为的接口(interface)(其他人指的是鸭子打字,这也很好,但我的意思是:鸟类的生物学类别,Avialae)。我也不建议使用以大写“I”开头的接口(interface)名称,例如 IBird,它只是没有说明您需要接口(interface)的原因。这就是问题的不同之处:使用接口(interface)构建继承层次结构,在有用时使用抽象类,在需要时实现具体类,并在适当时使用委托(delegate)。

关于Java 多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21824402/

相关文章:

java - 如何以多线程方式调用返回List元素的方法

PHP[OOP] - 如何手动调用类构造函数?

Java:一个类可以同时继承两个父类(super class)吗?

c++ - 重复继承和static_cast

java - 使用 HashMap 比较两个不同类型的列表

java - 需要向 webdriver 实例发送按键 (CTRL + Add) 来放大/缩小网页

java - 处理继承时删除条件语句

javascript - 使用构造函数和调用函数

C++ - 在没有 RTTI/dynamic_cast 的情况下向下转换菱形继承对象

java - 将 Boolean.TRUE/Boolean.FALSE 或 true/false 分配给 boolean 原始变量是否更好?