Как обойти отсутствие абстрактных полей в Java?

Предположим, у нас есть абстрактный класс 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может быть перезаписано абстрактным классом.

Вопрос:Какой обходной путь является распространенным способом достижения цели? Может быть, есть лучше, чем вышеперечисленные?

5
задан John Threepwood 21 July 2012 в 13:36
поделиться