合成与继承的结合2007-05-28 yycnet.yeah.net yyc译许多时候都要求将合成与继承两种技术结合起来使用。下面这个例子展示了如何同时采用继承与合成技术,从而创建一个更复杂的类,同时进行必要的构建器初始化工作:
//: PlaceSetting.java// Combining composition & inheritanceclass Plate {Plate(int i) {System.out.println("Plate constructor");}}class DinnerPlate extends Plate {DinnerPlate(int i) {super(i);System.out.println("DinnerPlate constructor");}}class Utensil {Utensil(int i) {System.out.println("Utensil constructor");}}class Spoon extends Utensil {Spoon(int i) {super(i);System.out.println("Spoon constructor");}}class Fork extends Utensil {Fork(int i) {super(i);System.out.println("Fork constructor");}}class Knife extends Utensil {Knife(int i) {super(i);System.out.println("Knife constructor");}}// A cultural way of doing something:class Custom {Custom(int i) {System.out.println("Custom constructor");}}public class PlaceSetting extends Custom {Spoon sp;Fork frk;Knife kn;DinnerPlate pl;PlaceSetting(int i) {super(i + 1);sp = new Spoon(i + 2);frk = new Fork(i + 3);kn = new Knife(i + 4);pl = new DinnerPlate(i + 5);System.out.println("PlaceSetting constructor");}public static void main(String[] args) {PlaceSetting x = new PlaceSetting(9);}} ///:~
尽管编译器会强迫我们对基础类进行初始化,并要求我们在构建器最开头做这一工作,但它并不会监视我们是否正确初始化了成员对象。所以对此必须特别加以留意。