3

私はいくつかのクラスを持っています。それらを紹介し、最後に私の質問をしてください:

複合関係にある 2 つのオブジェクトを含むコンテナー クラスがあります。

public class Container{

    A a;
    B b;

    public someMethod(){
        a.getC().myMethod(b);
    }
}

A と B はスーパークラス (またはインターフェイス) であり、サブタイプは複合関係で保持される型にもなります。

A には、(インターフェイス) タイプ C のメンバーが含まれています。

public class A{
   C c;
}


public interface C{
    public void myMethod(B b);
}

public class D implements C{
    public void myMethod(B b){
        //This code will modify the state of object b, in class Container.
        b.changeState();
    }
}

public class E implements C{
    public void myMethod(B b){
        //This code will modify the state of object b, in class Container.
        b.changeState();
    }
}

私の問題は、オブジェクト b の状態を、コンテナー クラスで開始するメソッドから、最終的に階層のコードを呼び出すメソッドから、動的バインディングを介して myMethod() を呼び出すクラス D および E に変更したいことです。ポリモーフィズムを使用して正しいmyMethod()(オブジェクトのタイプが D か E かに応じて) 実行するので、IF ステートメントを記述するのではなく、これを実行したいからです。

したがって、私の問題は、オブジェクトbのインスタンスをクラス階層を下ってmyMethodに継続的に渡すのは非常に悪いように思われるため、b固有のコードを実行してbの状態を変更できます。d と e (総称して c) から b を変更するために他にできることはありますか?

ジェネリックを使用せずにインターフェイスだけを使用してこれを機能させることができますが、ジェネリックを追加したときに型に問題があり、設計全体に欠陥があるかどうかを考え始めましたか?

編集:おそらくIFステートメントを使用するだけでこれを簡単に実行できますが、クラスDとEのポリモーフィズムを使用したエレガントなソリューションが必要でした.

4

2 に答える 2

0

B のインスタンスを E のコンストラクターに渡すことができます (またはセッターを使用します)。それ自体で問題が生じますが、少なくとも myMethod() を呼び出すたびに B を渡す必要がなくなります。これにより、引数は不要になりました。

例えば

Bの中のどこか

E myE = new E(this);

そして、Eの中で

final B myB;
public E(B myHigherLevelThing) {
  this.myB = myHigherLevelThing;
}

public void myMethod() {
  myB.changeState();
}

宣言には最も一般的なインターフェイスを使用してください。完全な階層について少し混乱しているので、改善の余地があるかもしれません...

于 2012-07-12T20:30:58.580 に答える