オブジェクト間のメッセージの受け渡し - 対象オブジェクトを参照するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/99684

  •  01-07-2019
  •  | 
  •  

質問

オブジェクト指向環境における最も基本的なタスクは、オブジェクトに対してメソッドを実行することです。これを行うには、メソッドを呼び出すオブジェクトへの参照が必要です。この参照を確立する適切な方法は、呼び出し元オブジェクトのコンストラクター (または初期化メソッド) にパラメーターとしてオブジェクトを渡すことですか?

オブジェクトの場合 foo オブジェクトへの呼び出し bar, 、(疑似コードで)次のように言うのは正しいですか?

bar = new barClass()
foo = new fooClass(bar)

メッセージをやり取りする必要がある場合はどうなりますか?対象オブジェクトを登録するメソッドが必要ですか?

foo = new fooClass()
bar = new barClass()

foo.register(bar)
bar.register(foo)

これに対処するパターンはありますか?

役に立ちましたか?

解決

一般に依存性注入が最適な方法です。通信する 2 つのオブジェクトについて話しているだけの場合は、最初の例のように、一方のインスタンスをパラメータとしてもう一方に渡します。コンストラクターを渡すことで、参照が常に有効であることが保証されます。それ以外の場合は、 register が呼び出されたことを確認するためにテストする必要があります。また、 register を複数回呼び出しても悪影響がないことを確認する必要があります。

他のオブジェクトがイベントに登録される制御オブジェクトが必要な場合はどうすればよいでしょうか。その場合は、Register メソッド (デリゲートに追加する可能性があります) を使用するのが適切です。

見る オブザーバーパターン

他のヒント

依存性注入フレームワークのような そして ガイス 初めてメッセージが必要になったときにメッセージの受信者を解決できるプロキシを使用することで、Java の循環依存関係に対するソリューションを提供します。ただし、これは一般的に適用できる OO パターンではありません。

そうですね、メッセージングのレベルに応じて、メッセージング サービスを実装できます。オブジェクトはメッセージをリッスンするか、MessageProvider の MessageListener として登録します。

2 つのオブジェクトが相互に参照している場合、循環依存関係が発生しますが、これはほとんどの場合悪いと考えられます。

オブジェクト タイプの 1 つが、他のオブジェクト タイプのファクトリになる可能性があります。Foo が新しい Bar を出力すると、接続はすでに確立されています。

foo = new Foo();
bar = Foo.Poop();

function Foo::Poop()
{
    bar = new Bar(this);
    myChildren.Add(bar);
    return bar;
}

bar.SayHiToParent();
foo.SayHiToChildren();

それは、2 つのオブジェクト間の正確な関係がどのようなものであるかに大きく依存すると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top