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