为什么很多不使用多继承?而是选择继承类+实现接口? 这个有什么好处?

我们知道在面向对象编程的时候,比如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想要继承吃素的功能,请问这个如何进行实现呢?就不能进行继承了对吗?

阅读 994
1 个回答

在多继承中,如果一个类从两个不同的父类继承,而这两个父类又有一个共同的祖先类,那么在实际调用祖先类的方法时,编译器可能不知道该选择哪个路径,这就会导致混乱。例如:

class A {
    void method() { System.out.println("A"); }
}

class B extends A {
    void method() { System.out.println("B"); }
}

class C extends A {
    void method() { System.out.println("C"); }
}

class D extends B, C {
    // D应该继承哪个method()?
}

这种情况在 C++ 中通过复杂的规则来解决,但它也增加了代码的复杂性和理解的难度。Java 为了保持语言的简单性和一致性,选择不支持类的多继承。

Bird想要继承吃素的功能,要么使Animal继承Vegetarian类,要么将Vegetarian做成接口,Java 提供了接口(interface)作为多继承的替代方案。虽然一个类只能继承一个父类,但它可以实现多个接口。

推荐问题
logo
Microsoft
子站问答
访问
宣传栏