《Kotlin核心编程》 ——3.3 解决多继承问题
3.3 解决多继承问题
上面我们讨论了很多关于继承的问题,下面我们来看一个更有意思的问题:多继承。
继承与实现是面向对象程序设计中不变的主题。众所周知,Java是不支持类的多继承的,Kotlin亦是如此。为什么它们要这样设计呢?现实中,其实多继承的需求经常会出现,然而类的多继承方式会导致继承关系上语义的混淆。本节我们会展示多继承问题的所在,以及如何通过Kotlin的语法来设计多种不同的多继承解决方案,从而进一步了解Kotlin的语言特性。
3.3.1 骡子的多继承困惑
如果你了解C++,应该知道C++中的类是支持多重继承机制的。然而,C++中存在一个经典的钻石问题—骡子的多继承困惑。我们假设Java的类也支持多继承,然后模仿C++中类似的语法,来看看它到底会导致什么问题。
abstract class Animal {
abstract public void run();
}
class Horse extends Animal { //马
@Override
public void run() {
System.out.println("I am run very fast");
}
}
class Donkey extends Animal { //驴
@Override
public void run() {
System.out.println("I am run very slow");
}
}
class Mule extends Horse, Donkey { //骡子
...
}
这是一段伪代码,我们来分析下这段代码具体的含义:
马和驴都继承了Animal类,并实现了Animal中的run抽象方法;
骡子是马和驴的杂交产物,它拥有两者的特性,于是Mule利用多继承同时继承了Horse和Donkey。
目前看起来没有问题,然而当我们打算在Mule中实现run方法的时候,问题就产生了:Mule到底是继承Horse的run方法,还是Donkey的run方法呢?这个就是经典的钻石问题。你可以通过继承关系图来更好地认识这个问题,如图3-1所示。
图3-1 菱形继承问题
所以钻石问题也被称为菱形继承问题。可以发现,类的多重继承如果使用不当,就会在继承关系上产生歧义。而且,多重继承还会给代码维护带来很多的困扰:一来代码的耦合度会很高,二来各种类之间的关系令人眼花缭乱。
于是,Kotlin跟Java一样只支持类的单继承。那么,面对多重继承的需求,我们在Kotlin中该如何解决这个问题呢?
- 点赞
- 收藏
- 关注作者
评论(0)