为了完全理解如何解决 Java 的多重继承问题,我有一个经典问题需要澄清。
可以说我有一个类,Animal它有子类Bird,Horse我需要创建一个类Pegasus,它既是鸟又是Bird马Horse。Pegasus
Animal
Bird
Horse
Pegasus
我认为这是经典的钻石问题。据我所知,解决这个问题的经典方法是制作Animal,Bird和Horseclasses 接口并Pegasus从中实现。
我想知道是否有另一种方法可以解决我仍然可以为鸟和马创建对象的问题。如果有一种方法可以创造动物,那也很好,但不是必需的。
您可以为动物类(生物学意义上的类)创建接口,例如public interface Equidae马和public interface Avialae鸟类(我不是生物学家,所以这些术语可能是错误的)。
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 {}
我想再补充一个细节。这是 OP 已经知道的。
但是,我想强调的是,我建议绕过接口的“多继承”问题,并且我不建议使用已经表示具体类型(例如 Bird)但更多是行为(其他人指鸭打字,这也很好,但我的意思是:鸟类的生物学类别,Avialae)。我也不建议使用以大写“I”开头的接口名称,例如IBird,它不能说明为什么需要接口。这就是问题的不同之处:使用接口构造继承层次结构,在有用时使用抽象类,在需要时实现具体类,并在适当时使用委托。
IBird