我有这段代码:
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没有引用,所以我不知道它是否安全。
答案 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 references和how 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的父级