Jak ominąć brak abstrakcyjnych pól w Javie?
Załóżmy, że mamy klasę abstrakcyjnąA
i chcemy zmusić wszystkie podklasy do posiadania pewnego pola. Nie jest to możliwe w Javie, ponieważ nie możemy zdefiniować pól abstrakcyjnych.
Obejście 1: Wymuś podklasy, aby wdrożyły metodę zapewniającą pożądaną wartość.
abstract class A {
abstract int getA();
}
Wada: Każda podklasa musi implementować metodę dla każdego pola abstrakcyjnego, które chcemy mieć. Może to prowadzić do wielu implementacji metod.
Korzyść: Możemy użyć tej metodygetA
w klasie abstrakcyjnej i zaimplementuj z nią metodyA
bez implementowania ich w każdej podklasie. Jednak wartość metody nie może zostać nadpisana przez klasę abstrakcyjną.
Obejście 2: Symuluj pole abstrakcyjne, zmuszając podklasę do nadania klasie abstrakcyjnej wartości.
abstract class A {
int a;
public A(int a) {
this.a = a;
}
}
Wada: Gdy mamy wiele pól (> 10), wywołanie super konstruktora będzie wyglądało trochę brzydko i myląco.
Korzyść: Możemy użyć polaa
w klasie abstrakcyjnej i zaimplementuj z nią metodyA
bez implementowania ich w każdej podklasie. Plus, wartośća
można nadpisać klasą abstrakcyjną.
Pytanie: Jakie obejście jest powszechnym sposobem osiągnięcia celu? Może jest coś lepszego niż powyższe?