Должен ли я использовать абстрактный метод или переменную экземпляра для данных, которые должны определяться подклассом?

Я пишу абстрактный класс, и у меня есть переменная, которая должна определяться подклассом (в данном случае это int, который используется в супер -учебный класс). Я не могу решить, определять ли защищенную переменную со значением по умолчанию и позволить подклассу изменять значение либо в конструкторе, либо с помощью метода установщика . Или определить абстрактный метод в родительском классе, чтобы все подклассы реализовали его и возвращали значение, которое они хотят использовать (затем получить доступ к методу в суперклассе, используя абстрактный метод). Может ли кто-нибудь сказать мне, есть ли веские причины, по которым один способ должен быть предпочтительнее другого?

Абстрактный метод:

public abstract int getValue();

public int getValue() {
    return 5;
}
  • Плюсы:

Заставляет подкласс подумать об этом значении и выбрать то, что он хочет be.

  • Минусы:

Нет значения по умолчанию, поэтому даже если большинство подклассов просто хотят использовать одно и то же значение, им все равно придется реализовать метод. (Метод можно сделать неабстрактным и вернуть значение по умолчанию, но тогда вы теряете преимущество, заставляющее подклассы думать о значении)

Защищенная переменная:

protected int value;

public SubClassImpl() {
    value = 5;
}
  • Плюсы:

Может определять значение по умолчанию value и подклассы могут просто игнорировать это, если им все равно.

  • Минусы:

Авторы подкласса не знают о существовании переменной, поэтому они могут быть удивлены поведением по умолчанию.

5
задан DaveJohnston 1 February 2011 в 14:48
поделиться