Как исправить цикл конструктора в производном классе? - PullRequest
0 голосов
/ 13 июня 2019

Я не хочу, чтобы производные классы (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 и сделать их известными Программе?

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Вам необходимо исключить конструирование класса CCEAG из конструктора класса CCEAG, что приводит к бесконечной рекурсии, которую вы наблюдаете.

Если вы хотите «скрыть» классы, сделайте их закрытыми и создайте фабричные общедоступные статические функции, которые создают экземпляры указанных классов.

class CCEAG {
    private class Ecri1 : CCEAG { };
    static public CCEAG createEcri1() { return new Ecri1(); }
};
1 голос
/ 13 июня 2019

Похоже, вы предполагаете статические данные * о машине (которые совместно используются экземплярами CCEAG)

    public static CCEAG MachineSpecificState;

    public static MachinesEnum CurrentMachine { get; set; }

И, если возможно, измените их на private вместо public

...