2

これは少し奇妙な質問です。コンストラクターでアプリの処理またはロジスティクスの処理を処理するLogicクラスを開始するGUIクラスがあり、それらはUIに接続された一連のハンドラークラスです。GUIクラスのコンポーネントActionListners KeyListeners

LogicクラスとHandlerクラスの両方のコンストラクターで、パラメーターとしてGUIクラスを取り込んで、 LogicクラスとHandlerクラスの両方からGUIクラスで作成されたGUIコンポーネントを操作できるようにします。

私の問題は、HandlerLogicクラスを使用し、その逆も同様であり(LogicクラスはHandlerクラスを使用します)、これは上記のメソッドでは実際には不可能です。他を使用してください。

例:

public class GUI() 
{
    this.handler = new Handler(this);
    this.logic = new Logic(this);
}

で何かをhandler使おうとすると、返されます。logicnull

これを修正する1つの方法は、セッターがhandlerとる、logicまたはその逆を行うことですが、これに対する答えのようには思えません。

4

3 に答える 3

1

単純:

public class GUI() 
{
    this.handler = new Handler(this);
    this.logic = new Logic(this);
    handler.setLogic(logic);
    logic.setHandler(handler);
}
于 2012-10-29T02:50:54.613 に答える
1

GUIでハンドラーとロジックを公開し、一般にアクセスさせることは可能だと思います。そうすることで、ハンドラーとロジックはすでにGUIを参照しているため、間接的に相互にアクセスできます。

class Gui {
  private Handler handler;
  private Logic logic;

  public Handler getHandler() {
    return this.handler;
  }
  public Logic getLogic() {
    return this.logic;
  }
}

class Handler {
  private Gui gui;
  public Handler(Gui gui) {
    this.gui = gui;
  }

  public void doSomething() {
    // access logic
    this.gui.getLogic().doSomeLogic();
  }
}

「エレガンス」に関しては、コンポーネント間の(imho)乱雑な依存関係の元のデザインはまったくエレガントではないと思います:)したがって、そのようなものを「エレガント」に見せることに焦点を当てるのではなく、再考することで、おそらくすべてを見つけることができます自動的にはるかにエレガントになります。:)

于 2012-10-29T03:46:23.473 に答える
0

の最初の使用の直前に、handlerこのlogicコードスニペットを配置できます
if(handler == null)
this.handler = new Handler(this);
if(logic == null)
this.logic = new Logic(this);

于 2012-10-29T02:52:34.753 に答える