为了完全理解如何解决 Java 的多重继承问题,我有一个需要澄清的经典问题。
假设我有课Animal
这有子类Bird
and Horse
我需要上课Pegasus
延伸自Bird
and Horse
since Pegasus
既是鸟又是马。
我认为这是经典的钻石问题。据我所知,解决这个问题的经典方法是使Animal
, Bird
and Horse
类接口和实现Pegasus
从他们。
我想知道是否有另一种方法来解决我仍然可以为鸟和马创建对象的问题。如果有一种方法能够创造动物,那就太好了,但不是必需的。
您可以为动物类(生物学意义上的类)创建接口,例如public interface Equidae
对于马和public interface Avialae
对于鸟类(我不是生物学家,所以这些术语可能是错误的)。
然后你仍然可以创建一个
public class Bird implements Avialae {
}
and
public class Horse implements Equidae {}
and also
public class Pegasus implements Avialae, Equidae {}
从评论中添加:
为了减少重复代码,您可以创建一个抽象类,其中包含要实现的动物的大部分通用代码。
public abstract class AbstractHorse implements Equidae {}
public class Horse extends AbstractHorse {}
public class Pegasus extends AbstractHorse implements Avialae {}
Update
我想补充一个细节。作为布莱恩评论 https://stackoverflow.com/questions/21824402/java-multiple-inheritance/21824485#comment33030508_21824485,这是OP已经知道的事情。
但是,我想强调的是,我建议绕过接口的“多重继承”问题,并且我不建议使用已经代表具体类型(例如 Bird)而更多代表行为的接口(其他人参考鸭子打字,这也很好,但我的意思只是:鸟类的生物学类别,Avialae)。我也不建议使用以大写“I”开头的接口名称,例如IBird
,它并没有告诉你为什么需要一个接口。这就是问题的区别:使用接口构造继承层次结构,在有用时使用抽象类,在需要时实现具体类,并在适当时使用委托。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)