2

面向对象环境中最基本的任务是在对象上执行方法。为此,您必须拥有对正在调用该方法的对象的引用。建立此引用以将对象作为参数传递给调用对象的构造函数(或初始化方法)的正确方法是什么?

如果 object foo 调用 object 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

通常依赖注入是要走的路。如果您只是在谈论两个对象进行通信,那么将其中一个的实例作为参数传递给另一个,就像在您的第一个示例中一样。传入构造函数确保引用始终有效。否则,您必须进行测试以确保已调用 register 。此外,您需要确保多次调用 register 不会产生不利影响。

如果你想要一个控制对象,其他对象注册事件怎么办。然后适合使用 Register 方法(可以添加到委托)。

参见观察者模式

于 2008-09-19T05:11:55.783 回答
0

好吧,根据消息传递的级别,您可以实现消息传递服务。对象侦听消息,或在某个 MessageProvider 上注册为 MessageListener。

如果两个对象相互引用,你最终会得到循环依赖,在大多数情况下我会认为这是不好的。

于 2008-09-19T04:47:13.207 回答
0

您的一种对象类型可能是另一种的工厂。当 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 回答
0

我认为这在很大程度上取决于两个对象之间的确切关系。

于 2008-09-19T08:03:40.770 回答