如何修复派生 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(); }
};