3

Xフィールドが含まれるクラスがありますA。これは、コンストラクターで初期化される最終フィールドです。Yこれで、このフィールドが常に のインスタンスである必要がある派生クラスができました。これBは、から派生したクラスですA。問題は、クラスYは、クラス B でのみ使用でき、その祖先では使用できない特定のメソッドを呼び出す必要があることですA

いくつかの解決策があります:

  1. Aから継承された型のフィールドを再利用しX、クラス内Yで にキャストABます。これにより、私のコードは厄介な型キャストでいっぱいになります。
  2. type の別のフィールドを追加しますB。現在、型キャストはありませんが、常に同じ値を保持する必要があるわずかに異なる型の 2 つのフィールドがあります。これも気分が悪いです。
  3. 、throwBにも提供するすべてのメソッドを追加します。これにより、そのクラスでは意図的に意味をなさないいくつかの奇妙なメソッドが追加されます。ANotImplementedException

このフィールドを処理する最も正しい方法はどれですか? それとも、他にもっと良いものが存在するのでしょうか?これは言語固有のものではないと思いますが、私が使用している Java で実行できるはずです。

4

3 に答える 3

5

Xタイプはおそらくジェネリックタイプである必要があります。

public class X<T extends A> {

    protected T a;

    public X(T a) {
        this.a = a;
    }
}

public clas Y extends X<B> {

    public Y(B b) {
        super(b);
    }

    public void foo() {
        // here, this.a is of type B, without any type cast.
    }
}
于 2013-01-26T20:21:25.910 に答える
2

私の意見では、解決策1が最も正しい方法です。オブジェクトが特定のクラスのものであることがわかっている場合は、そのオブジェクトをそのクラスにキャストしても問題はありません。あなたがこれをしている間に仮定をしているならそれは間違っているでしょう、しかしあなたが言っていることによれば、これは仮定ではありません。たぶん、基になるフィールドを正しい型にキャストしてそれで実行するだけのゲッターメソッドを作成しますか?そうすれば、(サブクラスごとに)1回だけキャストする必要があります。

解決策#2は、フィールドが互いに適切に最新でなくなると、とらえどころのないランタイムエラーを引き起こします。これは真剣に最悪の解決策のように聞こえます。

解決策#3はまだ悪いソフトウェア設計のように感じます。メソッドが存在し、それが抽象クラスになく、プロトタイピングフェーズにない場合は、そのメソッドを実装する必要があります。それ以外の場合は、誤解を招くようなインターフェイスを提供することで、(クラスの)ユーザーに不要なトラップを設定している可能性があります。

于 2013-01-26T20:21:12.697 に答える
2

私が考えることができる唯一の正しい解決策は、#1のバリエーションです。クラスYにキャストされたフィールドを型に返すgetterメソッドを追加しB、このgetterを介してのみフィールドにアクセスします。これには1つのキャストのみが必要であり、有益な副作用として、フィールドが実際にである必要があるコードの部分も文書化されますB

于 2013-01-26T20:16:20.610 に答える