如何修复派生 class 中的构造函数循环?
How to fix constructor loop in derived class?
我不希望派生的 类(Ecri1 和 Ecri2)在 CCEAG 以外的地方为人所知,但是当我这样尝试时,我得到一个 WhosebugException,因为会有一个构造函数循环打电话。
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 并让程序知道它们?
看起来您正在假设静态机器*数据(在 CCEAG 实例之间共享)
public static CCEAG MachineSpecificState;
public static MachinesEnum CurrentMachine { get; set; }
如果可能,将它们更改为 private
而不是 public
您需要放弃从 class CCEAG
的构造函数构造 class CCEAG
,这会导致您正在观察的无限递归。
如果你想要 "hide" classes,将它们设为私有并创建工厂 public 静态函数,这会创建所述 classes 的实例。
class CCEAG {
private class Ecri1 : CCEAG { };
static public CCEAG createEcri1() { return new Ecri1(); }
};
我不希望派生的 类(Ecri1 和 Ecri2)在 CCEAG 以外的地方为人所知,但是当我这样尝试时,我得到一个 WhosebugException,因为会有一个构造函数循环打电话。
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 并让程序知道它们?
看起来您正在假设静态机器*数据(在 CCEAG 实例之间共享)
public static CCEAG MachineSpecificState;
public static MachinesEnum CurrentMachine { get; set; }
如果可能,将它们更改为 private
而不是 public
您需要放弃从 class CCEAG
的构造函数构造 class CCEAG
,这会导致您正在观察的无限递归。
如果你想要 "hide" classes,将它们设为私有并创建工厂 public 静态函数,这会创建所述 classes 的实例。
class CCEAG {
private class Ecri1 : CCEAG { };
static public CCEAG createEcri1() { return new Ecri1(); }
};