三个班级之间的循环参考

时间:2012-07-19 11:25:44

标签: c# class circular-reference

我有三个班级,他们之间有一个循环引用。

class A 
{
    public A()
    {
        B obj = new B();
    }
}
class B
{
    public B()
    {
        C obj = new C();
    }
}
class C
{
    public C()
    {
        A obj = new A();
    }
}

当我创建A的对象时,它会抛出异常。
我如何创建循环引用彼此的类实例?

5 个答案:

答案 0 :(得分:6)

  

当我创建A的对象时,它会抛出异常

是的,它会的。创建A会创建一个新的B,用于创建新的C,从而创建新的A等。

  

我如何解决循环引用。

据推测,您希望C构造函数了解原始A?如果是这样,有两种选择:

  • 分别构建所有三个,然后告诉他们彼此。这要求类型是可变的。
  • thisA构造函数传递给B构造函数,然后将其从B构造函数传递给C构造函数。这在允许this转义A的构造函数方面是令人讨厌的,应该小心地完成非常。 (BC在有机会完成初始化之前不应该调用实例上的任何方法。)

答案 1 :(得分:4)

你可以这样做:

class A 
{
    public B b;

    public A()
    {
        this.b = new B(new C(this));
    }
}
class B
{
    public C c;
    public B(C c)
    {
        this.c = c;       
    }
}
class C
{
    public A a;
    public C(A a)
    {
        this.a = a;
    }
}

答案 2 :(得分:2)

最简单的方法是创建一个定义A类公共接口的接口IA,然后创建A类实现接口IA。 然后添加一个可以创建A实例并返回IA的工厂类。这样,类C不需要知道类A,并且循环引用被破坏。

答案 3 :(得分:2)

您也可以尝试加载对象lazily。这样,它们实际上不会立即被构造,也不会进入构造的循环循环,而是在你真正需要时构造它们。

您可以尝试在MSDN文章中使用C#的Lazy<T>实现,或通过使用get{ }构建访问权限来处理涉及properties的内容。

答案 4 :(得分:0)

当你调用A,B或C的构造函数时,你总会得到一个异常。也许你可以通过将一个参数传递给构造函数来解决它,但我想知道你想用这个结构做什么。你能告诉我吗?