3

私はこのクラス宣言を持っています

abstract class  A {
    protected static String message = "Hello";
}

protected static String message = "Whatever";そして、すべてのサブクラスで入力しないように(この静的フィールドの値はサブクラスごとに異なります)、このフィールドをサブクラスに伝播させたいと思います。

私はこれがうまくいかないことを知っています:

class B extends A {

    static {
        message = "Blablabla";
    }
}

静的フィールド/メソッドが継承されないため、実際にを変更するためAです。message私が知りたいのは、これを行う他の方法があるかどうか、または各サブクラスの静的フィールドを書き直す必要があるかどうかです。

4

5 に答える 5

5

静的フィールドの代わりに、各サブクラスによってオーバーライドされる保護されたメソッドgetMessage()を使用することをお勧めします。

class B extends A {
    @Override
    protected String getMessage() {
        return "Blablabla";
    }
}
于 2012-08-27T10:54:38.887 に答える
1

それを行う簡単な方法はありません。

Classオブジェクトをメッセージにマップするユーティリティクラスの使用を検討してください。これは、に基づくメッセージを操作するための一般的な方法を使用するのに役立ちますthis.getClass()

于 2012-08-27T11:40:29.583 に答える
1

この場合、通常は get メソッドを作成します。

abstract class  A {
    private static final String DEFAULT_MESSAGE = "Hello";
    protected String getMessage() {
        return DEFAULT_MESSAGE;
    }
}

これにより、必要に応じてサブクラスでメッセージを簡単にオーバーライドできます。

于 2012-08-27T10:52:48.370 に答える
0

静的フィールドとメソッド継承されます-Cプログラマーとして、私はそれらを「グローバル」変数に似ており、クラスに名前空間が付けられている(そしてプライベート/保護された制限がある)と考えるように言われました。

最初のスニペットから、B.message「こんにちは」になります。

あなたはどちらかをしなければなりません

public class A {
  protected String message = "Hello";
}

また

public class A {
  private static String message = "Hello";
}

public class B {
  private static String message = "Howdy";
}
于 2012-08-27T10:56:25.840 に答える
0

アスペクトは、あなたがやりたいことを達成させてくれますか? ある場所から、特定の名前を持つメソッドの戻り値をクラスごとに構成/管理できます。...各サブクラスで同じ定型文「private static ...」を複製するよりも、まだ多くの作業が必要です。

于 2012-08-27T22:55:15.430 に答える