封装、继承、多态都是面向对象的重要机制,但是如果不能准确区分它们在逻辑设计和物理设计上的不同(如表1-4所示),就无法正确使用这些机制。
表1-4 面向对象重要机制的逻辑和物理区分
在逻辑上,封装有两方面含义:集中数据与行为;分离接口和实现。但在程序设计语言的编程机制中,提供的却是成员变量、成员方法联合起来的声明和编译机制。所以“封装”的物理设计与逻辑设计有些脱节,物理设计无法适配逻辑设计的“分离接口与实现”这一思想。在物理设计中,能够体现数据与行为的集中,却无法保障“接口和实现相分离”这一思想,使得很多类的设计都没能做到“信息隐藏”式的封装。但如果能够综合逻辑设计和物理设计,就能够建立足够正确的“封装”类。
继承在逻辑上用于组织差异类型,是“IS-A”的关系。但在编程语言机制中,继承声明代表着复用——接口复用和代码复用。如果只是按照编程机制使用继承,就可能产生违反LSP原则的错误,产生低质量。全面理解继承的逻辑设计和物理设计之后,就能有效避免对继承的误用。
狭义的多态在逻辑上是指“多个不同对象在同一个场景下表现出相同行为的现象”,而在编程语言中多态被处理成继承和动态绑定。所以在物理上的多态是依附于继承的,但在逻辑上的多态并不是与继承捆绑的。Com+构件模型中的构件更替也是多态的,虽然它们之间没有继承关系。