到底选择合成照旧担任
无论合成照旧担任,都答允我们将子工具置于本身的新类中。各人或者会奇怪两者间的差别,以及到底该如何选择。
假如想操作新类内部一个现有类的特性,而不想利用它的接口,凡是应选择合成。也就是说,我们可嵌入一个工具,使本身能用它实现新类的特性。但新类的用户会看到我们已界说的接口,而不是来自嵌入工具的接口。思量到这种结果,我们需在新类里嵌入现有类的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);
}
} ///:~
由于汽车的装配是妨碍阐明时需要思量的一项因素(并非只是基本设计简朴的一部门),所以有助于客户措施员领略如何利用类,并且类建设者的编程庞洪水平也会大幅度低落。
如选择担任,就需要取得一个现成的类,并建造它的一个非凡版本。凡是,这意味着我们筹备利用一个通例用途的类,并按照特定的需求对其举办定制。只需稍加想象,就知道本身不能用一个车辆工具来合成一辆汽车——汽车并不“包括”车辆;相反,它“属于”车辆的一种种别。“属于”干系是用担任来表达的,而“包括”干系是用合成来表达的。