オブジェクト間のメッセージの受け渡し - 対象オブジェクトを参照するにはどうすればよいですか?
-
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 メソッド (デリゲートに追加する可能性があります) を使用するのが適切です。
見る オブザーバーパターン
他のヒント
そうですね、メッセージングのレベルに応じて、メッセージング サービスを実装できます。オブジェクトはメッセージをリッスンするか、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 つのオブジェクト間の正確な関係がどのようなものであるかに大きく依存すると思います。