通过此字段更改类字段

时间:2014-10-15 17:16:47

标签: c#

我有这段代码:

abstract class A
{
    public Master parent;
    public virtual void DoSomething()
}

class Master
{
    public A a;
    public void DoSomething()
    {
        a.DoSomething();
    }
}

class A1 : A
{
    public override void DoSomething()
    {
        parent.a = new A2();
    }
}

class A2 : A
{
    public override void DoSomething()
    {
        parent.a = new A1();
    }
}

我这样做:

Master m = new Master();
m.a = new A1();
m.a.parent = m;
m.DoSomething();

以这种方式改变m.a好吗?当A1.DoSomething()运行时,GarbageCollector可以删除A1对象吗?当A1将m.a更改为A2时,A1没有引用,所以我不知道它是否安全。

3 个答案:

答案 0 :(得分:1)

虚拟方法还有其他身体,你必须使用抽象关键字将此方法设为抽象。

 abstract class A
    {
        public Master Parent;
            public virtual void DoSomething()
            {
                //This block is missing in your code
            }
    }


 static void Main(string[] args)
    {
        var m = new Master();
        m.a = new A1 {Parent = m};
        m.DoSomething();
    }

答案 1 :(得分:1)

您可能需要阅读circular referenceshow to get rid of them。有没有理由你不能从大师班改变?

abstract class A
{
    public static A GetNextA(AType type)
    {
        switch (type)
        {
            case AType.A1: return new A1();
            case AType.A2: return new A2();
            default: return null;
        }
    }

    public abstract AType DoSomething();
}

class Master
{
    public A a;
    public void DoSomething()
    {
        AType nextAType = a.DoSomething();
        a = A.GetNextA(nextAType);
    }
}

class A1 : A
{
    public override AType DoSomething()
    {
        //do Work
        return AType.A2;
    }
}

class A2 : A
{
    public override AType DoSomething()
    {
        //do Different Work
        return AType.A1;
    }
}

enum AType
{
    A1,
    A2
}

并使用它们:

static void Main(string[] args)
{
    var m = new Master();
    m.a = new A1();
    m.DoSomething();
}

答案 2 :(得分:0)

我认为这是安全的。当DoSomething()完成时,GC将收集A1的第一个实例。但看起来,你需要在A1.DoSomething()

中设置A2的父级