条款32:确定你的public继承塑模出is-a关系
1、何谓is-a关系?
比如说两个类A和B,假如B公开继承自A,那么就意味着:B一定属于类A,但是A却不一定属于B。一个简单的例子,假如A是塑模的是人,而B塑模的是学生。那么一般来讲:学生一定属于人,人却不一定属于学生。
2、编程时,is-a关系可能是违背由现实生活得来的经验直觉的
例子1:企鹅与鸟
现实生活中的经验:企鹅是一种鸟,但是编程时却不能将二者塑模成is-a 关系。
因为一般而言鸟都是会飞的,所以我们很自然的在鸟类中会写一个成员方法:飞行。
但是,企鹅会飞吗?显然不会,那么企鹅是一种鸟,但是企鹅却不会飞,这就会导致如果将二者塑模成is-a 关系时出现问题。
可以采取的做法:在鸟基类中不写:飞行这种行为。继承自会飞的鸟的类中写上飞行方法。
例子2:正方形与矩形
现实生活中的经验:正方形是一种矩形,但是编程时却不能将二者塑模成is-a 关系。
因为对于矩形来说,有一种行为,即:可以只改变高度,而不改变宽度。但是,对于正方形来说,只要改变了高度或者宽度中的任意一个,另外一个就应该被改变,否则它不再属于正方形。于是,一种可以作用于矩形的行为,却不能作用于正方形。因此,不能将二者塑模成is-a关系。