为了完全理解如何解决 Java 的多重继承问题,我有一个经典问题需要澄清。
假设我有类 Animal
这有子类 Bird
和 Horse
我需要创建一个类 Pegasus
从 Bird
和 Horse
扩展而来,因为 Pegasus
既是鸟又是马。
我认为这是经典的菱形继承(钻石问题)。据我所知,解决这个问题的经典方法是使 Animal
、Bird
和 Horse
类接口(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/