Piszę klasę abstrakcyjną i mam zmienną, która powinna być zdefiniowana przez podklasę (w tym przypadku jest to int, które jest używane w super-klasie). Nie mogę zdecydować, czy zdefiniować zmienną protected
z wartością domyślną i pozwolić podklasie zmienić wartość w konstruktorze lub poprzez metodę setter
. Lub, aby zdefiniować metodę abstrakcyjną w klasie nadrzędnej, tak aby wszystkie podklasy musiały ją implementować i zwracać wartość, która ma być użyta (następnie uzyskać dostęp do metody w super-klasie za pomocą metody abstrakcyjnej). Czy ktoś może mi powiedzieć, czy istnieją jakieś ważne powody, dla których jeden sposób powinien być preferowany w stosunku do drugiego?Czy należy użyć metody abstrakcyjnej lub zmiennej instancji dla danych, które powinny być określone w podklasie?
Streszczenie Metoda:
public abstract int getValue();
public int getValue() {
return 5;
}
- Plusy:
Siły podklasa myśleć o tej wartości i wybrać to, co chcą go mieć.
- Wady:
Brak wartości domyślnej, więc nawet jeśli większość podklas prostu chcesz używać tej samej wartości mają jeszcze do wdrożenia metody. (Metoda ta może być wykonana nie abstrakcyjne i przywrócić wartość domyślną, ale wtedy tracisz przewagę zmuszając podklasy myśleć o wartość)
Protected Zmienna:
protected int value;
public SubClassImpl() {
value = 5;
}
- Zalety:
Może zdefiniować wartość domyślną, a podklasy mogą ją zignorować, jeśli nie będą miały na to wpływu.
- Wady:
Autorzy podklasy nie są świadomi istnienia zmiennej, więc może być zaskoczony przez zachowanie domyślne.
Czy wartość jest niezmienna? Jeśli nie, kto jest odpowiedzialny za zmianę wartości? –
Nie ma wymogu, aby wartość była niezmienna, ale nie spodziewałbym się, że zostanie ona zmieniona po utworzeniu obiektu. – DaveJohnston
Myślę, że lepiej spojrzeć na to z innej perspektywy. Jeśli nie ma wymogu, aby było to zmienne, należy zacząć od jego niezmienności. Zmień ją na zmienną, jeśli pojawi się wymaganie. –