两个物体在彼此不知情的情况下与第三个物体相互作用

Two objects interating with a third without knowing about each other

假设我有两个 类、FooBar,如下所示:

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 的两个实例,比如 fooAfooB,以及一个 bar 的实例。 bar 包含对两个 Foo 实例的复制引用,每个 Foo 实例包含对 bar 的复制引用。这个想法是 bar“知道”fooAfooB,反之亦然,但 fooA 不知道 fooB.

我不想让 fooAfooBbar 互动,而不是彼此互动。比如说,如果 fooA 改变了 bar 的某些内容,则必须将这些更改告知 fooB,而不必知道 bar 是否改变了自己,或者是否有其他改变 bar.我希望 fooAfooB 以及 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);
        }
    }

这将确保一个方法调用另一个方法的结束。

问题中没有足够的信息来理解您仅使用此代码段的意图

此外,请注意 FooBar 都是 class,这意味着 _bar 等引用将始终指向最多 up-to-date 信息.它们不存储 Bar 的副本,而是指向定义 Bar 对象的内存。因此,除非一个 class 的状态取决于另一个的状态,否则无需推动更改。