多重继承与单一继承:
并不是多重继承就不好,单一继承就好。
造成这个误会的主要原因, C++ 中的多重继承方式,让可读性、可理解性变差。
其实,在现实世界中,多重继承的关系就是存在的,你可以是一个父亲,同时也可以是一个老师。
造成我们一直对单一继承有好感的原因,是因为 C# 和 Java 都是单一继承。
但是,在 C# 和 Java 中,只是使用了接口,来实现了“多重继承”的目标,并且提高了可读性。
但是一个语言,本身就支持多重继承,且可读性也很好,你是不是觉得不错?
没错,很多动态语言使用 Mixin 的方式来支持多重继承。
抽象、继承、多态
抽象和继承,不是为了对现实世界的事物进行分类,尽管看上去很像。
抽象和继承,是为了复用,为了 DRY 。
在代码中,很多本应该是一个类,被拆分成 2,3 多个类的情况很多。
为什么呢?因为 DRY 。
那按照什么来拆分类呢?
就是角色、职责、协作, DRY 原则,单一职责原则,封装变化原则
角色、职责、协作
在所有设计模式中, 90% 都是根据角色、职责、 DRY 得出来的。
当一个类中,职责过多,或者变化太多,就要抽离(抽象分离)出来
设计模式中,
所有 行为模式 ,都是由于某种行为类职责会常变化,或因为多种原因会使其某部分职责变化。
然后就 把该部分职责,抽离出来,并以该职责的名字命名这种模式。
例如:
命令模式,是把命令职责抽离出来
状态模式,是把状态变化职责抽离出来
构建模式,是把构建过程职责抽离出来
如果你仔细研究创建模式、行为模式、结构模式,
都是把相应的创建职责、行为职责、结构相关的职责抽离出来的。