Java 程序设计语言(第四版)读书笔记 第三章 类的扩展


只要稍微有点OO常识的人,都知道类的扩展,尽管类的扩展是如此基础,然而能够知道什么时候去用,怎么用的人并不多。
下面是书中所探讨的一些原则和例子:
1.如果要创建的类和源类存在"IsA"的关系,那么就适合扩展。
2.尽量用组合(HasA)而非扩展(IsA)。

设想一个Point类,它用(x,y)来表示二维空间中的一个点,如果我们要创建一个表示屏幕上的彩色象素点的Pixel类,我们是否可以让Pixel扩展Point呢?
首先Pixel IsA Point,这意味着所有适合Point的应用,都可以用Pixel来代替。
而对于一个圆(Circle)来说,它是否同样适合扩展Point呢?一个圆并不是一个点,尽管一个圆可以用一个点和一个半径来描述,但是点却具有一些任何
圆都不具有的用处。比如可以将矩形的中心放在某个定点上,而圆则不妥。圆和点的关系是HasA而不是IsA的关系。

正确的选择IsA或是HasA是一件微妙而重要的事情,比如我们可以将员工抽象为Employee类,而将经理Manager扩展Employee,毕竟经理也是员工。
但,更多的情况却是一个人可能有多重身份,比如他是一个项目的经理,却是另一个项目的员工?此时,如果能够引入一个角色类Role,采用Employee HasA Role,
或者更多的Role,如此设计更具有灵活性。

关于如何设计一个可扩展的类,下面摘录一句话:
非final的类又两类接口,其中public类接口是为使用该类的程序员提供的,而protected接口则是为扩展该类的程序员提供的。
这两类接口都是真正的契约,应当精心设计。

你可能感兴趣的:(J2SE)