从已有类派生
类继承在基类与派生类之间建立关系。派生类可以使用基类提供的部分属性和方法,并增加自己的内容,让共有行为集中维护。哪些成员可见、怎样建立对象,都由语言规则决定。继承写出了程序定义之间的联系,而现实对象分类是否适合这套层级,仍要结合实际行为判断。
参考:[1]
重写方法与动态分派
派生类可以为某个已有方法提供自己的实现。通过共同接口调用对象时,动态分派能够依据实际对象类型选择相应方法,于是调用者使用同一操作,得到不同对象各自的行为。字段隐藏、静态方法与实例方法的规则未必相同,不能只凭相同名字就推断所有访问都会动态选择。
参考:[2]
初始化仍需要协同
对象建立时,基类负责的状态与派生类增加的状态都需要初始化。Java的构造器不会作为普通成员被继承,但派生类构造器可以调用基类构造器。Python也提供super来配合继承顺序调用方法。初始化顺序与参数约定若不协调,复用已有代码仍可能留下不完整或不一致的对象。
参考:[1]
多重继承与组合选择
Python允许多个基类,并用方法解析顺序处理名字查找;Java的类只有一个直接父类,接口另有规则。层级越复杂,共享祖先和覆盖关系越需要清楚。另一些设计把协作对象保存为成员,再把工作委托给它们;这称为组合,适合表达使用关系,而不必把所有复用都写成类层级。
参考:[2]