如何避免循环引用OOAD设计

时间:2012-08-20 07:02:14

标签: oop

我有类似下面的类结构,下面的场景将创建一个循环引用。如何避免这种情况?

public class classA
{
    public classA()
    {
        classB b= new classB();
        b.classBMethod();
    }
    public void classAMethod()
    {
        Console.WriteLine("Class A Method");
    }
}
public class classB
{
    public classB()
    {
        classC c = new classC();
        c.classCMethod();
    }
    public void classBMethod()
    {
        Console.WriteLine("Class B Method");
    }
}
public class classC
{
    public classC()
    {
        classA a = new classA();
        a.classAMethod();
    }
    public void classCMethod()
    {
        Console.WriteLine("Class C Method");
    }
}
  

如何避免循环引用?请告诉我不同​​的替代方案来设计这个

2 个答案:

答案 0 :(得分:5)

您的代码没有循环引用问题 当您开始关注引用并最终到达开始位置时,将发生循环引用。在你的情况下,你所做的是声明局部变量然后你有:

new ClassA()-> (calls) -> new ClassB()->(calls)->new ClassC()->calls->new ClassA()-> (calls) -> new ClassB()->(calls)-> etc forever  

GC很聪明,可以解决循环引用,但你所做的事情从根本上是有缺陷的。也许你应该解释一下你想要实现的目标。

答案 1 :(得分:2)

这创造了一个没有尽头的螺旋数据结构。 但是,解决这个问题并且仍然可以从任何类(A,B或C)开始的最简单方法是向对象添加一个公共布尔标志,以确定是否发生了循环。如果此标志为false,则继续,如果为true,则停止循环。如果你试图创建没有结束的螺旋,你可能需要添加一个每帧调用一次的更新方法,以避免实例中的操作过载。

如果我确切地知道你试图用这种逻辑创造什么,我可以给出一个不那么模糊的答案。如果不清楚,我很抱歉。