c# - C# 中友元类用例的解决方法

标签 c# .net

考虑以下代码模式:

// Each foo keeps a reference to its manager
class Foo
{
    private FooManager m_manager;
}

// Manager keeps a list of all foos
class FooManager
{
    private List<Foo> m_foos;
}

问题:没有办法创建一个新的 Foo 并更新 FooManager 中的 m_foos 列表和新 Foo 实例中的 m_manager 引用而不公开一些私有(private)的(并且冒着有人将列表与实际 Foos 取消同步的风险) .

例如可以在 Foo 中实现构造函数 Foo(FooManager manager)。它可以设置 m_manager 引用,但它无法访问 m_foos 列表。或者您可以在管理器中实现 CreateFoo() 方法。它可以访问 m_foos 列表,但无法在 Foo 中设置 m_manager。

在C++中,显然会声明FooManager是Foo的友元来表达设计意图,但这在C#中是不可能的。我也知道我可以使 Foo 成为 FooManager 的内部类以获得访问权限,但这也不是解决方案(如果 Foo 可以属于多个管理器类怎么办?)

顺便说一句。我知道 .NET 中的“内部”访问,但它要求 Foo 和 FooManager 独立存在于单独的程序集中,这是 Not Acceptable 。

在不公开私有(private)内容的情况下,有什么变通办法吗?

最佳答案

如果我理解正确的话:

public abstract class FooBus
{
    protected static FooBus m_bus;
}

public sealed class Foo : FooBus
{
    private FooManager m_manager;

    public Foo(FooManager fm)
    {
        if (fm == null)
        {
            throw new ArgumentNullException("Use FooManager.CreateFoo()");
        }

        if (m_bus != fm)
        {
            throw new ArgumentException("Use FooManager.CreateFoo()");
        }

        m_manager = fm;
    }
}

public class FooManager : FooBus
{
    private List<Foo> m_foos = new List<Foo>();

    public Foo CreateFoo()
    {
        m_bus = this;
        Foo f = new Foo(this);
        m_foos.Add(f);
        m_bus = null;

        return f;
    }
}

关于c# - C# 中友元类用例的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5921612/

相关文章:

c# - 让 jqGrid 使用不同的页面来查看一行

c# - 有没有更有效的方法将这些平面数据放入字典中?

c# - 如何检测一个对象是一个泛型集合,以及它包含哪些类型?

c# - CE5 中的触摸屏阻止来自外围设备的数据流量

c# - 未优化的 IEnumerable<>.Last with predicate

c# - 让 WCF 服务知道 SQL Server Service Broker 消息已到达

c# - Filter Type.GetProperties(),其中 PropertyType.Name 位于列表中

c# - SetBounds 和 SetBoundsCore 有什么区别

.net - Azure WebJob 存储连接

c# - 解析 JSON 对象数组 : "The best overloaded method match has some invalid arguments"