5.8.2 利用组合实现复用

5.8.2 利用组合实现复用

如果需要复用一个类,除把这个类当成基类来继承之外,还可以把该类当成另一个类的组合成分,从而允许新类直接复用该类的public方法。
不管是继承还是组合,都允许在新类中直接复用旧类的方法。

继承子类可以获取父类的公有方法

对于继承而言,子类可以直接获得父类的public方法,程序使用子类时,将可以直接访问该子类从父类那里继承到的方法;

组合通过定义旧类的成员变量来使用旧类的公有方法

组合则是把旧类对象作为新类的成员变量组合进来,用以实现新类的功能,用户看到的是新类的方法,而不能看到被组合对象的方法。因此,通常需要在新类里使用private修饰被组合的旧类对象

组合设计和继承设计系统开销差不多

当创建一个子类对象时,系统不仅需要为该子类定义的实例变量分配内存空间,而且需要为它的父类所定义的实例变量分配内存空间。所以:

  • 如果采用继承的设计方式,假设父类定义了2个实例变量,子类定义了3个实例变量,当创建子类实例时,系统需要为子类实例分配5块内存空间;
  • 如果采用组合的设计方式,先创建被嵌入类实例,此时需要分配2块内存空间,再创建整体类实例,也需要分配3块内存空间,只是需要多一个引用变量来引用被嵌入的对象。通过这个分析来看,继承设计与组合设计的系统开销不会有本质的差别。

什么时候使用继承

继承是将一个较为抽象的父类改造成能适用于某些特定需求的子类的过程,此时使用继承更能表达其现实意义

什么时候使用组合

如果两个类之间有明确的整体、部分的关系,应该采用组合关系来实现复用

继承要表达的是一种”是(is-a)”的关系,而组合表达的是”有(has-a)”的关系。