指引网

当前位置: 主页 > 编程开发 > Java >

到底选择合成还是继承

来源:网络 作者:佚名 点击: 时间:2017-11-14 06:11
[摘要] 无论合成还是继承,都允许我们将子对象置于自己的新类中。大家或许会奇怪两者间的差异,以及到底该如何选择。 如果想利用新类内部一个现有类的特性,而不想使用它的接口,通常应选择

  无论合成还是继承,都允许我们将子对象置于自己的新类中。大家或许会奇怪两者间的差异,以及到底该如何选择。
  
  如果想利用新类内部一个现有类的特性,而不想使用它的接口,通常应选择合成。也就是说,我们可嵌入一个对象,使自己能用它实现新类的特性。但新类的用户会看到我们已定义的接口,而不是来自嵌入对象的接口。考虑到这种效果,我们需在新类里嵌入现有类的private对象。
  
  有些时候,我们想让类用户直接访问新类的合成。也就是说,需要将成员对象的属性变为public。成员对象会将自身隐藏起来,所以这是一种安全的做法。而且在用户知道我们准备合成一系列组件时,接口就更容易理解。car(汽车)对象便是一个很好的例子:
  
  //: Car.java
  // Composition with public objects
  
  class Engine {
   public void start() {}
   public void rev() {}
   public void stop() {}
  }
  
  class Wheel {
   public void inflate(int psi) {}
  }
  
  class Window {
   public void rollup() {}
   public void rolldown() {}
  }
  
  class Door {
   public Window window = new Window();
   public void open() {}
   public void close() {}
  }
  
  public class Car {
   public Engine engine = new Engine();
   public Wheel[] wheel = new Wheel[4];
   public Door left = new Door(),
      right = new Door(); // 2-door
   Car() {
    for(int i = 0; i < 4; i++)
     wheel[i] = new Wheel();
   }
   public static void main(String[] args) {
    Car car = new Car();
    car.left.window.rollup();
    car.wheel[0].inflate(72);
   }
  } ///:~
  
  由于汽车的装配是故障分析时需要考虑的一项因素(并非只是基础设计简单的一部分),所以有助于客户程序员理解如何使用类,而且类创建者的编程复杂程度也会大幅度降低。
  
  如选择继承,就需要取得一个现成的类,并制作它的一个特殊版本。通常,这意味着我们准备使用一个常规用途的类,并根据特定的需求对其进行定制。只需稍加想象,就知道自己不能用一个车辆对象来合成一辆汽车——汽车并不“包含”车辆;相反,它“属于”车辆的一种类别。“属于”关系是用继承来表达的,而“包含”关系是用合成来表达的。
------分隔线----------------------------