购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

is-a关系与is-like-a关系

继承机制存在一个有待商榷的问题:只应该重写基类中定义的方法吗?(并且不能添加基类中不存在的新方法)如果是,就意味着子类和基类的类型是完全相同的,因为它们的接口一模一样。结果就是,你可以直接用子类的对象代替基类的对象。这种纯替换关系通常叫作“替换原则” 。从某种意义上说,这是一种理想的继承方式。这种情况下基类和子类之间的关系通常叫作“is-a”关系,意思是“A是B”,比如“圆形是一个形状”。甚至有一种测试是否是继承关系的方法是,判断你的类之间是否满足这种“is-a”关系。

有时候,你会为子类的接口添加新的内容,从而扩展了原有的接口。在这种情况下,子类的对象依然可以代替基类的对象,但是这种代替方案并不完美,因为不能通过基类的接口获取子类的新方法。我将这种关系描述为“is-like-a”关系(这是我自创的词),意思是“A像B”,即子类在拥有基类接口的同时,也拥有一些新的接口,所以不能说两者是完全等同的。以空调为例,假设你的房间里已经安装了空调,也就是拥有能够降低温度的接口。现在发挥一下想象力,万一空调坏了,你还可以用热泵作为替代品,因为热泵既可以制冷也可以制热(见图1-7)。在这种情况下,热泵“就像是”空调,只不过热泵能做的事情更多而已。此外,由于设计房间的温度控制系统时,功能仅限于制冷,所以系统和新对象交互时也只有制冷的功能。虽然新对象的接口有所扩展,但现有系统也只能识别原有的接口。

图1-7

观察图1-7你就能知道,基类“制冷系统”通用性并不高,最好可以将其改名为“温度调节系统”,使其同时包含制热功能。这样一来,之前提及的替换原则就可以派上用场了。不过话说回来,这张图也反映了真实世界中的设计方式。

当你充分理解了替换原则之后,可能会认为这种纯替换方式才是唯一正确的方式。如果你的设计能够应用纯替换原则,那就太棒了。然而实际情况是,你会发现经常需要为子类的接口添加新方法。只要稍加观察,就很容易分辨出这两种情况的应用场合。 +GzgptbTVtqrms6lF53kJr0nJqT6xTs4zq2d3EvpwG1+B22aloJgfbN2S5Ps3vbU

点击中间区域
呼出菜单
上一章
目录
下一章
×