@pst のコメントは、この解決策につながります。
これは、変数では実行できません。しかし、抽象クラスは特定のメソッドが実装されていることを要求することができます: このメソッドは適切な値を返すことができます
変数を設定または返す関数を宣言するabstract
ことから、サブクラスにそれを正しく実装させることができます。
次に、外部クラスのすべてのサブクラスから関数を呼び出す必要があります。これは、外部クラスのどこかで実行する必要があることを意味します。これは、サブクラスの呼び出しを心配することなく、外部クラスの引数なしのコンストラクターで実行できますsuper
。
注: コンストラクターがスーパークラス コンストラクターを明示的に呼び出さない場合、Java コンパイラーは、スーパークラスの引数のないコンストラクターへの呼び出しを自動的に挿入します。スーパー クラスに引数のないコンストラクタがない場合、コンパイル時エラーが発生します。Object にはそのようなコンストラクターがあるため、Object が唯一のスーパークラスであれば問題はありません。
(Java ドキュメント: スーパー)
それに基づいて、このソリューションは持ちこたえ、次のいずれかである限り、変数を正しく強制的に設定します。
- スーパークラスでは他のコンストラクターは作成されません (したがって、代わりにサブクラスでスーパーを使用して別のコンストラクターを呼び出すことはできません)。
- スーパークラスの他のすべてのコンストラクターは、デフォルトのコンストラクターを内部的に呼び出します
コード:
スーパークラス:
public abstract class SuperClass {
// Variable all inner classes must set
static int myVar = 0;
public SuperClass() {
myVar = giveValue();
}
public abstract int giveValue();
}
サブクラス:
public class SubClass extends SuperClass {
@Override
public int giveValue() {
return 5; // individual value for the subclass
}
}