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