7.4.3 对象职责

我们来重新回顾第1章中的Shape例子,请见图7.11。

图7.11 Shape类继承体系图

多态性是对继承的最优雅的使用之一。请记住Shape类是不能被实例化的。由于它有个抽象方法getArea(),所以它是一个抽象类。第8章将解释抽象类的细节。

不过Rectangle和Circle可以被实例化,因为它们是实实在在的类。尽管矩形和圆都是形状,但它们有不同之处。它们作为形状,可以计算各自的面积。而各自计算面积的公式是不同的。因此,计算面积的公式不能放置在Shape类中。

这就是多态性的由来。多态性的前提是你可以给不同的对象发送消息,而对象则会根据各自的类型进行响应。例如,如果你向Circle类发送getArea()消息,调用的计算方式与向Rectangle类发送相同的getArea()消息的计算方式是不同的。这是因为Circle和Rectangle拥有各自的响应方式。如果你让Circle返回其面积,它知道怎么做。如果你让圆绘制自身,它也知道怎么做。即使Shape对象可以被实例化,它也做不到这些,因为它缺乏对自身足够的信息。注意图7.11中的UML图,Shape类中的getArea()方法是斜体的。这表示了该方法是抽象方法。

假设如下一个简单的示例,我们有四个类:抽象类Shape,实体类Circle、Rectangle和Star。以下是代码:

注意每个类中只存在一个方法:draw()。以下是对象自身职责与多态性相关的重要一点,实体类自身负责实现绘制功能。Shape类并不提供绘制的代码,Circle,Rectangle和Star类需要各自实现绘制代码。以下是证明这一点的一些代码: ...

Get 面向对象的思考过程(原书第5版) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.