两个物体在彼此不知情的情况下与第三个物体相互作用
Two objects interating with a third without knowing about each other
假设我有两个 类、Foo
和 Bar
,如下所示:
public class Foo{
private Bar _bar;
public int Value { get; private set; }
public void UpdateValue(Bar bar)
{
// Update Value, say:
Value++;
// What do I put here to change bar?
}
// Bunch of methods.
}
public class Bar{
private List<Foo> _foos;
public bool Value {get; private set; }
public void UpdateValue(Foo foo)
{
// Update Value, say:
Value = !Value;
// What do I put here to change foo?
}
// A bunch of other methods.
}
我想要 Foo
的两个实例,比如 fooA
和 fooB
,以及一个 bar
的实例。 bar
包含对两个 Foo
实例的复制引用,每个 Foo
实例包含对 bar
的复制引用。这个想法是 bar
“知道”fooA
和 fooB
,反之亦然,但 fooA
不知道 fooB
.
我不想让 fooA
和 fooB
与 bar
互动,而不是彼此互动。比如说,如果 fooA
改变了 bar
的某些内容,则必须将这些更改告知 fooB
,而不必知道 bar
是否改变了自己,或者是否有其他改变 bar
.我希望 fooA
和 fooB
以及 bar
始终拥有彼此的最新信息。问题是,我不确定实现这些交互的最佳方式。
根据最佳实践,有没有好的方法来做到这一点?或者更好的是,我如何使两个 foo
实例与 bar
交互以在不了解彼此的情况下同时更改彼此的内部值(任何更改都是有效的,我只是真正担心如何可以实现互动)。
我想这就是你想要的:
public class Foo
{
private Bar _bar;
public int Value { get; private set; }
public void UpdateValue(Bar bar)
{
// Update Value, say:
Value++;
// What do I put here to change bar?
bar.UpdateValue(this);
}
// Bunch of methods.
}
public class Bar
{
private List<Foo> _foos;
public bool Value { get; private set; }
public void UpdateValue(Foo foo)
{
// Update Value, say:
Value = !Value;
// What do I put here to change foo?
foo.UpdateValue(this);
}
// A bunch of other methods.
}
但是你最终会遇到一些无休止的递归。
因此您需要指定一个终止条件,其中一个更新将不会调用另一个更新。
例如
public void UpdateValue(Foo foo)
{
// Update Value, say:
Value = !Value;
if(Value)
{
// What do I put here to change foo?
foo.UpdateValue(this);
}
}
这将确保一个方法调用另一个方法的结束。
问题中没有足够的信息来理解您仅使用此代码段的意图。
此外,请注意 Foo
和 Bar
都是 class,这意味着 _bar
等引用将始终指向最多 up-to-date 信息.它们不存储 Bar
的副本,而是指向定义 Bar
对象的内存。因此,除非一个 class 的状态取决于另一个的状态,否则无需推动更改。
假设我有两个 类、Foo
和 Bar
,如下所示:
public class Foo{
private Bar _bar;
public int Value { get; private set; }
public void UpdateValue(Bar bar)
{
// Update Value, say:
Value++;
// What do I put here to change bar?
}
// Bunch of methods.
}
public class Bar{
private List<Foo> _foos;
public bool Value {get; private set; }
public void UpdateValue(Foo foo)
{
// Update Value, say:
Value = !Value;
// What do I put here to change foo?
}
// A bunch of other methods.
}
我想要 Foo
的两个实例,比如 fooA
和 fooB
,以及一个 bar
的实例。 bar
包含对两个 Foo
实例的复制引用,每个 Foo
实例包含对 bar
的复制引用。这个想法是 bar
“知道”fooA
和 fooB
,反之亦然,但 fooA
不知道 fooB
.
我不想让 fooA
和 fooB
与 bar
互动,而不是彼此互动。比如说,如果 fooA
改变了 bar
的某些内容,则必须将这些更改告知 fooB
,而不必知道 bar
是否改变了自己,或者是否有其他改变 bar
.我希望 fooA
和 fooB
以及 bar
始终拥有彼此的最新信息。问题是,我不确定实现这些交互的最佳方式。
根据最佳实践,有没有好的方法来做到这一点?或者更好的是,我如何使两个 foo
实例与 bar
交互以在不了解彼此的情况下同时更改彼此的内部值(任何更改都是有效的,我只是真正担心如何可以实现互动)。
我想这就是你想要的:
public class Foo
{
private Bar _bar;
public int Value { get; private set; }
public void UpdateValue(Bar bar)
{
// Update Value, say:
Value++;
// What do I put here to change bar?
bar.UpdateValue(this);
}
// Bunch of methods.
}
public class Bar
{
private List<Foo> _foos;
public bool Value { get; private set; }
public void UpdateValue(Foo foo)
{
// Update Value, say:
Value = !Value;
// What do I put here to change foo?
foo.UpdateValue(this);
}
// A bunch of other methods.
}
但是你最终会遇到一些无休止的递归。
因此您需要指定一个终止条件,其中一个更新将不会调用另一个更新。
例如
public void UpdateValue(Foo foo)
{
// Update Value, say:
Value = !Value;
if(Value)
{
// What do I put here to change foo?
foo.UpdateValue(this);
}
}
这将确保一个方法调用另一个方法的结束。
问题中没有足够的信息来理解您仅使用此代码段的意图。
此外,请注意 Foo
和 Bar
都是 class,这意味着 _bar
等引用将始终指向最多 up-to-date 信息.它们不存储 Bar
的副本,而是指向定义 Bar
对象的内存。因此,除非一个 class 的状态取决于另一个的状态,否则无需推动更改。