2

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

object がobject foo を呼び出す場合 bar、(疑似コードで) 次のように言うのは正しいですか?

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

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

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

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

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

4

5 に答える 5

3

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

于 2008-09-19T05:06:21.303 に答える
2

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

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

オブザーバー パターンを参照してください

于 2008-09-19T05:11:55.783 に答える
0

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

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

于 2008-09-19T04:47:13.207 に答える
0

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

于 2008-09-19T08:03:40.770 に答える
0

オブジェクト タイプの 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();
于 2008-09-19T05:38:45.347 に答える