Czytam sobie "Thinking in Java" wyd. IV (polska edycja) str. 225 "Wybór między kompozycją a dziedziczeniem" i nie rozumiem tych zapisów poniżej:
Kompozycja jest zazwyczaj stosowana wtedy, gdy potrzebne są właściwości istniejącej klasy wewnątrz własnej, lecz nie jej interfejs. Osada się zatem obiekt tak, by można go było wykorzystać w tworzonej klasie, ale użytkownik klasy widzi tylko interfejs nowej klasy bez interfejsu obiektu osadzonego. Aby uzyskać taki efekt, wystarczy zamieścić obiekty klas istniejących wewnątrz nowej klasy jako składowe typu private.
Dotąd myślałem, że zrozumiałem czym jest interfejs,ale jak czytam to powyższe to wiem, że nic nie wiem :/
Interfejs który implementuje dana klasa to po prostu dopisywania konkretnych ciał metod z danego interfejsu w klasie, która ten interfejs implementuje. Gdzie więc przy kompozycji ten interfejs nowej klasy? O co tu chodzi??
Druga kwestia, założmy, że mam klasę (a w zasadzie dwie klasy i testującą) w której jest obiekt innej klasy:
package kompozycja2;
public class Main {
public static void main(String[] args) {
KlasaA a1 = new KlasaA();
System.out.println(a1.getPoleA());
KlasaA a3 = new KlasaA();
a3.setPoleA(666);
KlasaB b1 = new KlasaB(a3);
}
}
package kompozycja2;
public class KlasaB {
//tutaj jest ten przykład kompozycji, tak?
private KlasaA a2;
KlasaB(KlasaA a2){
System.out.println("Konstruktor klasaB");
this.a2 = a2;
System.out.println("Inicjalizacja obiektu a2 typu KlasaA");
}
public KlasaA getA2() {
return a2;
}
public void setA2(KlasaA a2) {
this.a2 = a2;
}
}
package kompozycja2;
public class Main {
public static void main(String[] args) {
KlasaA a1 = new KlasaA();
System.out.println(a1.getPoleA());
KlasaA a3 = new KlasaA();
a3.setPoleA(666);
KlasaB b1 = new KlasaB(a3);
//i co dalej, jak zobaczyc roznice gdy w klasaB pole z obiektem klasaA będzie publiczne a nie prywatne..
//jak przetestować fatk, że pole w KlasaA ma nową wartość 666 i teraz ta wartość jest dostępna z poziomu klasaB..
}
}
Wydaje mi się, że z powodu braku praktyki nie rozumiem np. powyższego przykładu, który próbuję skończyć a nie jestem w stanie. Chodzi o te końcowe komentarze. No bo tak : tworzę sobie nowy obiekt a3 typu KlasaA. Przekazuję go w konstruktorze do KlasaB(), no i jak teraz odczytać tę wartosć pola typu KlasaA z poziomu już klasaB? Proszę o pomoc.