-1

我有三个类,它们之间有一个循环引用。

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,它会引发异常。
如何创建循环引用彼此的类实例?

4

5 回答 5

5

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

嗯,是的,它会的。创建A创建一个新B的创建一个新的C,创建一个新的A等等。

我该如何解决循环引用。

大概您希望C构造函数了解原始信息A?如果是这样,有两种选择:

  • 分别构建所有三个,然后告诉他们彼此。这要求类型是可变的。
  • thisA构造函数传递给B构造函数,然后从B构造函数传递给C构造函数。this就允许escape的构造函数而言,这是令人讨厌的A,应该非常小心地完成。(B并且C在实例有机会完成初始化之前不应调用实例上的任何方法。)
于 2012-07-19T11:29:00.977 回答
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;
    }
}
于 2012-07-19T11:29:29.663 回答
2

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

您可以尝试在 MSDN 文章中使用 C# 的实现Lazy<T>,或者通过使用.get{ }

于 2012-07-19T11:36:27.837 回答
2

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

于 2012-07-19T11:31:07.517 回答
0

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

于 2012-07-19T11:29:07.080 回答