《Kotlin核心编程》 ——3.3 解决多继承问题

举报
华章计算机 发表于 2020/02/21 22:43:56 2020/02/21
【摘要】 本节书摘来自华章计算机《Kotlin核心编程》 —— 书中第3章,第3.3.1节,作者是水滴技术团队 。

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所示。

 image.png

图3-1 菱形继承问题

所以钻石问题也被称为菱形继承问题。可以发现,类的多重继承如果使用不当,就会在继承关系上产生歧义。而且,多重继承还会给代码维护带来很多的困扰:一来代码的耦合度会很高,二来各种类之间的关系令人眼花缭乱。

于是,Kotlin跟Java一样只支持类的单继承。那么,面对多重继承的需求,我们在Kotlin中该如何解决这个问题呢?


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。