Kotlin 核心编程 (52):面向对象 3.3.1

阅读数:1 2019 年 12 月 28 日 22:25

Kotlin核心编程(52):面向对象 3.3.1

(骡子的多继承困惑)

内容简介
本书不是一本简单介绍 Kotlin 语法应用的图书,而是一部专注于帮助读者深入理解 Kotlin 的设计理念,指导读者实现 Kotlin 高层次开发的实战型著作。书中深入介绍了 Kotlin 的核心语言特性、设计模式、函数式编程、异步开发等内容,并以 Android 和 Web 两个平台为背景,演示了 Kotlin 的实战应用。
全书共 13 章,分为 4 个部分:
热身篇—Kotlin 基础(第 1~2 章),简单介绍了 Kotlin 设计哲学、生态及基础语法,其中包括 Kotlin 与 Scala、Java 之间的关联与对比,以及 Kotlin 的类型声明的特殊性、val 和 var 的使用、高阶函数的使用、面向表达式编程的使用、字符串的定义与操作等内容;
下水篇—Kotlin 核心(第 3~8 章),深入介绍了面向对象、代数数据类型、模式匹配、类型系统、Lambda、集合、多态、扩展、元编程等 Kotlin 开发核心知识,这是本书的重点,其中涉及很多开发者特别关心的问题,比如多继承问题、模式匹配问题、用代数数据类型抽象业务问题、泛型问题、反射问题等。
潜入篇—Kotlin 探索(第 9~11 章),探索 Kotlin 在设计模式、函数式编程、异步和并发等编程领域的应用,其中包括对 4 大类设计模式、Typeclass 实现、函数式通用结构设计、类型替代异常处理、共享资源控制、CQRS 架构等重点内容的深入剖析;
遨游篇—Kotlin 实战(第 12~13 章),着重演示了 Kotlin 在 Android 和 Web 平台的实战案例,其中涉及架构方式、单向数据流模型、解耦视图导航、响应式编程、Spring 5 响应式框架和编程等内容。

如果你了解 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 所示。

Kotlin核心编程(52):面向对象 3.3.1

图 3-1 菱形继承问题

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

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

Kotlin核心编程(52):面向对象 3.3.1

购书地址 https://item.jd.com/12519581.html?dist=jd

评论

发布