Я пишу абстрактный класс, и у меня есть переменная, которая должна определяться подклассом (в данном случае это int, который используется в супер -учебный класс). Я не могу решить, определять ли защищенную
переменную со значением по умолчанию и позволить подклассу изменять значение либо в конструкторе, либо с помощью метода установщика
. Или определить абстрактный метод в родительском классе, чтобы все подклассы реализовали его и возвращали значение, которое они хотят использовать (затем получить доступ к методу в суперклассе, используя абстрактный метод). Может ли кто-нибудь сказать мне, есть ли веские причины, по которым один способ должен быть предпочтительнее другого?
Абстрактный метод:
public abstract int getValue();
public int getValue() {
return 5;
}
Заставляет подкласс подумать об этом значении и выбрать то, что он хочет be.
Нет значения по умолчанию, поэтому даже если большинство подклассов просто хотят использовать одно и то же значение, им все равно придется реализовать метод. (Метод можно сделать неабстрактным и вернуть значение по умолчанию, но тогда вы теряете преимущество, заставляющее подклассы думать о значении)
Защищенная переменная:
protected int value;
public SubClassImpl() {
value = 5;
}
Может определять значение по умолчанию value и подклассы могут просто игнорировать это, если им все равно.
Авторы подкласса не знают о существовании переменной, поэтому они могут быть удивлены поведением по умолчанию.