3.4.5 层次结构
正如类A可以是B的超类一样,B也可以是C的超类。面向对象层次结构可以模拟类似的多层关系。一个具有多种动物的动物园模拟程序,可能会将每种动物作为Animal类的子类,如图3-8所示。
|
| 图 3-8 |
当编写每个子类的代码时,您可能会发现许多代码是相似的。当出现这种情况时,应该考虑给它们一个共同的超类。Lion和Panther的移动方式以及食物相同,说明可以使用一个BigCat类。还可以进一步将Animal类细分以包括WaterAnimals和Marsupials。图3-9显示了利用了这种共性的更加系统化的设计。
|
| 图 3-9 |
生物学家看到这个体系可能会失望-- 海豚和企鹅并不属于同一科。然而,这强调了一个要点-- 在代码中,需要平衡现实关系以及共享功能关系。即使现实中两种事物紧密联系,在代码中可能没有任何关系,因为它们没有共享功能。您可以简单地把动物区分为哺乳动物以及鱼类,但是这种做法会使得超类没有任何共同因素。
另一个要点是可以用其他方法创建这个层次结构。前面的设计基本上是根据动物的移动方式创建的。如果根据动物的食物或者身高创建,这个层次结构可能会有很大的不同。总之,关键在于如何使用类,需求决定对象层次结构的设计。
优秀的面向对象层次结构能够做到以下几点:
使得类之间存在有意义的功能关系。
将共同的功能放到超类,从而支持代码重用
避免子类过多地重写超类的功能,除非超类是一个抽象类。