我们知道在面向对象编程的时候,比如Bird既有叫的功能,又有飞的功能,可以通过继承Animal和实现飞的接口的功能实现:
class Animal {
shout() {
}
}
interface OtherFunction {
fly():void
}
class Bird extends Animal implements OtherFunction {
shout() {
console.log('呜呜')
}
fly() {
console.log('飞到北京天安门')
}
}
问题1:
为什么很多不使用多继承?而是选择继承类+实现接口?
这个有什么好处?
如果还有其他类的功能比如:
class Vegetarian {
eat() {
console.log('吃素')
}
}
问题2:
Bird想要继承吃素的功能,请问这个如何进行实现呢?就不能进行继承了对吗?
在多继承中,如果一个类从两个不同的父类继承,而这两个父类又有一个共同的祖先类,那么在实际调用祖先类的方法时,编译器可能不知道该选择哪个路径,这就会导致混乱。例如:
这种情况在 C++ 中通过复杂的规则来解决,但它也增加了代码的复杂性和理解的难度。Java 为了保持语言的简单性和一致性,选择不支持类的多继承。
Bird想要继承吃素的功能,要么使Animal继承Vegetarian类,要么将Vegetarian做成接口,Java 提供了接口(interface)作为多继承的替代方案。虽然一个类只能继承一个父类,但它可以实现多个接口。