3.3.1 多继承的必要性

很多语言类的书籍都会介绍,多继承是个危险的行为。诚然,狭义上的 多继承在绝大多数情况下都是不合理的。这里所谓的“狭义”,指的是一个类拥有多个父类。我们要明确一个概念:继承的目的不是代码复用,而是声明一种 is a 的关系,代码复用只是 is a 关系的一种外在表现。

因此,如果你在需要狭义上的多继承,还是应该先问问自己,存在这么多 is a 关系么?你是需要声明这种关系,还是为了代码复用。如果是后者,有很多更优雅的解决方案,因为多继承的一个直接问题就是菱形问题(Diamond Problem)。

但是广义上的多继承是必须的,不能因为害怕多继承的问题就忽略多继承的优点。广义多继承指的是通过定义借口(Interface)以及接口方法的默认实现,形成“一个父类,多个接口”的模式,最终实现代码的复用。当然,不是每个语言都有接口 的概念,比如 Python 里面的 Mixin,会在 3.3.3节中介绍。

广义上的多继承非常常见,有一些教科书式的例子,比如动物可以按照哺乳动物,爬行动物等分类,也可以按照有没有翅膀来分类,某一个具体的动物可能满足上述好几类。在实际的开发中也到处都是广义多继承的使用场景,比如 iOS 或者安卓开发中,系统控件的父类都是固定的,如果想让他们复用别的代码,就会比较麻烦。

Last updated