【发布时间】:2019-10-28 03:03:58
【问题描述】:
我不希望派生类(Ecri1 和 Ecri2)在 CCEAG 以外的其他地方被知道,但是当我这样尝试时,我得到了 StackOverflowException,因为会调用一个构造函数循环。
class Program
{
static void Main(string[] args)
{
CCEAG state = new CCEAG();
}
}
public class CCEAG
{
public CCEAG MachineSpecificState;
public MachinesEnum CurrentMachine { get; set; }
public enum MachinesEnum
{
ECRI1,
ECRI2,
}
public CCEAG()
{
if (MachineSpecificState == null)
{
switch (CurrentMachine)
{
case MachinesEnum.ECRI1:
MachineSpecificState = new Ecri1();
break;
case MachinesEnum.ECRI2:
MachineSpecificState = new Ecri2();
break;
default:
CurrentMachine = MachinesEnum.ECRI1;
MachineSpecificState = new Ecri1();
break;
}
}
}
}
public class Ecri1 : CCEAG
{
}
public class Ecri2 : CCEAG
{
}
解决此问题的最佳做法是什么?我是否需要放弃 CCEAG 并将其所有代码复制到 Ecri1 和 Ecri2 并让 Program 知道它们?
【问题讨论】:
-
请显示所有相关代码。例如,您正在执行此假定循环行为的实例化的代码。
-
另外,请查看 .net 的命名约定。类应该用大写字母命名,而不是全部大写,并且名称应该具有足够的描述性,以便您了解类的用途。
-
当
CCEAG的构造函数被调用时,MachineSpecificState永远为null,CurrentMachine永远为ECRI1。如果完全设置了它们,那么直到调用构造函数之后才会设置。 -
@rory.ap 这是一个最小的例子。如果你运行它,你会看到我描述的循环行为。我已经缩短了这个问题的类名。
-
确保
MachineSpecificState得到一个值,在你的示例代码中它总是null,因此你的问题。
标签: c# stack-overflow derived-class