高级程序设计

20 - 继承和代码复用

2020-04-09 15:00 CST
2020-04-11 15:01 CST
CC BY-NC 4.0

子类型的定义?(见第17讲

聚集

基于继承的代码复用是通过把一个类的代码包含(复制)到另一个类中来实现的。

继承不是代码复用的唯一方式,有些代码复用不宜用继承来实现(如飞机类复用发动机类)。

代码复用的另一种方式是通过聚集/聚合(aggregation)来实现,即把一个类作为另一个类的成员对象类。

  • 具有继承关系的两个类之间通常属于一般与特殊的关系(is-a-kind-of)。
  • 具有聚集关系的两个类之间通常属于整体与部分的关系(is-a-part-of)。

在基于对象的程序设计中,一般采用聚集来实现代码复用。

继承和聚集的比较

继承与封装存在矛盾:

  • 在继承方式的代码复用中,一个类通过protected访问控制,向外界提供两种接口:
    • public:对象(实例)用户;
    • public + protected:派生类用户
  • 在聚集方式的代码复用中,一个类对外只需一个接口public

继承更容易实现子类型:

  • 在C++中,public继承的派生类往往可以看成是基类的子类型。
  • 在需要基类对象的地方可以用派生类对象替代;
  • 发给基类对象的消息也能发给派生类对象。

而具有聚集关系的两个类不具有子类型关系。