Философия Java

         

Объединение композиции и наследования


Совместное использование композиции и наследования часто и широко используется при программировании. Следующий пример показывает создание более комплексного класса использующего оба метода и композицию, и наследование с необходимыми инициализациями конструкторов:

//: c06:PlaceSetting.java

// Объединение композиции и наследования.

class 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"); } }

// Нормальный путь, сделать что-то:

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); } } ///:~

В то время, как компилятор требует от Вас инициализировать базовые классы и требует, что бы Вы делали это в начале конструктора, он не убеждается, в том, что Вы инициализировали остальные объекты, так что Вам придется быть осторожным.



Содержание раздела