2011-02-01 8 views
5

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.

+1

Czy wartość jest niezmienna? Jeśli nie, kto jest odpowiedzialny za zmianę wartości? –

+0

Nie ma wymogu, aby wartość była niezmienna, ale nie spodziewałbym się, że zostanie ona zmieniona po utworzeniu obiektu. – DaveJohnston

+0

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. –

Odpowiedz

8

Cóż, to zależy ...

  • Czy wartość muszą być w stanie zmienić w trakcie trwania tego przedmiotu? Jeśli nie, możesz uczynić go parametrem chronionego konstruktora i uczynić go końcową prywatną zmienną w twojej klasie bazowej.

  • Czy podklasy mają uzasadnienie do obliczenia zmiennej w oparciu o inny stan zmienny? Jeśli tak, odpowiedni byłby abstrakcyjny getter.

  • W przeciwnym razie prawdopodobnie użyłbym zmiennej prywatnej i chronionego setera. Ogólnie nie jestem fanem zmiennych nieprywatnych. To może pozwolić Ci reagować na zmiany wartości w twojej klasie bazowej, takie jak zmiana innych pól komputerowych. Aby uniknąć obecności wartości domyślnej, można połączyć to z parametrem konstruktora, aby wymusić wartość początkową, którą podklasa mogłaby później zmienić za pomocą ustawiacza.

+2

+1 dla parametru "chroniony parametr konstruktora". – Raedwald

+0

Dzięki, chroniony konstruktor jest prawdopodobnie tak, jak chcę. – DaveJohnston

Powiązane problemy