条款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关系。

总之,如果将两个类A、B,想要塑模成公共继承关系,B继承自A:那就必须做到A的所有行为都可以作用在B上。这才是能够塑模成is-a关系的关键。

posted @ 2019-12-18 22:28  江南又一春  阅读(111)  评论(0编辑  收藏  举报