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