Предположим, у нас есть абстрактный класс A
и мы хотим, чтобы все подклассы имели определенное поле. Это невозможно в Java, потому что мы не можем определять абстрактные поля.
Обходной путь 1:Заставить подклассы реализовать метод, который обеспечивает желаемое значение.
abstract class A {
abstract int getA();
}
Недостаток:Каждый подкласс должен реализовать метод для каждого абстрактного поля, которое мы хотим иметь. Это может привести к множеству реализаций методов.
Преимущество:Мы можем использовать метод getA
в абстрактном классе и реализовывать с ним методы в A
, не реализуя их в каждом подклассе.Но значение, стоящее за методом, не может быть перезаписано абстрактным классом.
Обходной путь 2:Смоделируйте абстрактное поле, заставив подкласс дать абстрактному классу значение.
abstract class A {
int a;
public A(int a) {
this.a = a;
}
}
Недостаток:Когда у нас есть несколько полей (> 10 ), вызов суперконструктора будет выглядеть немного уродливым и запутанным.
Преимущество:Мы можем использовать поле a
в абстрактном классе и реализовывать с ним методы в A
, не реализуя их в каждом подклассе. Кроме того, значение a
может быть перезаписано абстрактным классом.
Вопрос:Какой обходной путь является распространенным способом достижения цели? Может быть, есть лучше, чем вышеперечисленные?