Как определить константы/конечные переменные в абстрактных суперклассах, но назначить их в подклассе?
У меня есть абстрактный класс, где я хочу объявить конечные переменные.
Однако я хочу присвоить значения этим переменным только в конструкторах моих подклассов.
По-видимому, это невозможно, потому что все "окончательные поля должны быть инициализированы". Я не понимаю, почему, поскольку невозможно создать экземпляр абстрактного класса.
То, что я хотел бы иметь, выглядит примерно так:
abstract class BaseClass {
protected final int a;
}
class SubClass extends BaseClass {
public SubClass() {
a = 6;
}
}
Я представляю что-то подобное методам при реализации интерфейса. Затем вам также необходимо реализовать методы в классе (sub).
Ответы
Ответ 1
Вы должны определить конструктор в своем абстрактном классе, который принимает значение для a
и вызывает этот конструктор из ваших подклассов. Таким образом, вы гарантируете, что ваш последний атрибут всегда инициализируется.
abstract class BaseClass {
protected final int a;
protected BaseClass(int a)
{
this.a = a;
}
}
class SubClass extends BaseClass {
public SubClass() {
super(6);
}
}