1.3 对象的继承
继承是类之间相互结合的方式。如同我们从父母那里继承他们的生物学特性,我们可以设计一个类从另一个类继承(这比女儿遗传父亲的卷发更具预见性)。
类可以从一个父类那里继承或扩展。而类并不知道其他类从它这里继承,因此一个父类可以有多少子类且没有限制。一个子类拥有父类的所有特性,我们可以增加或修改子类中的任意元素,使其变得与众不同。
以Courier类作为例子,在应用程序里为每个Courier创建子类。在图1.1中,Courier类有两个子类,每个子类都有各自的ship()方法。
图1.1使用UML(Unified Modeling Language, 统一建模语言)来解释Courier父类和它的两个子类MonotypeDelivery及PigeonPost之间的关系。UML是一种为类关系建模的常用技术,在本书和其他OOP系统文档中都会看到它。
在图1.1中,将类表示为一个盒子,盒子分为三个部分:上面是类的名称,中间表示类所拥有的属性,下面是类所有的方法。图1.1中的箭头表示类从何处得到继承,在图1.1中可以看到MonotypeDelivery类和PigeonPost类都是继承自Courier类。在代码中,这三个类是这样声明的:
子类用extends关键字表明它们的父类。这使子类具备了Courier父类的一切特性,包括所有的属性和方法。每个Courier代码都有极其不同的运行方式,这两个子类都需要重新声明ship()方法并添加自己的实现(上面示例中使用的是伪代码,你可以发挥自己的想象力思考如何在PHP中实现pigeon代码)。
当一个子类重新声明父类中的某个方法时,它必须使用与父类方法相同的参数。PHP读取extends关键字,获取父类的副本,并且在子类中发生变更的任意内容基本上都会在子类中重写。