У меня есть базовый абстрактный класс с несколькими классами, которые расширяют и переопределяют его, однако все они имеют один и тот же конструктор. Прямо сейчас я вызываю каждый конструктор из инструкции коммутатора:абстрактная реализация класса
case 1: return new A(arg1); // arg is int
и т. Д., Для примерно 10 классов. Есть ли способ с генериками или делегатами сделать один метод, который будет принимать имя класса и создать экземпляр этого типа с аргументами?
Это помогло бы, поскольку, если я внес изменения в конструкторы, мне также придется изменить каждое экземпляр.
Делегат будет наиболее откровенным, но исследование говорит, что нет, чтобы назначать конструкторов делегатам.
ДОБАВЛЕНИЕ: Теперь я нахожусь на wifi с моим ноутбуком, а не только с моей ячейкой, поэтому здесь идет какой-то код.
Это пример того, что происходит сейчас:
switch (new Random().Next(4))
{
case 3:
// classA : baseClass, args{int, bool, otherClass}
return new classA(arg1, arg2, arg3);
case 2:
// classB : baseClass, args{int, bool, otherClass}
return new classB(arg1, arg2, arg3);
case 1:
// classC : baseClass, args{int, bool, otherClass}
return new classC(arg1, arg2, arg3);
case 0:
// classD : baseClass, args{int, bool, otherClass}
return new classD(arg1, arg2, arg3);
default:
continue;
}
Я хотел бы назвать один cоздателем экземпляров в конце блока с тремя аргументами.
Решение Я думал это сделать и класс cоздателем экземпляров, который работает примерно так:
ClassInstantiator inst = new ClassInstantiator(arg1, arg2, arg3);
switch(new Random().Next(4))
{
case 4:
return inst.instantiate<classA>();
...
}
Это уже встроены в язык, или кто-нибудь знает более элегантное решение?
+1 для отличного вопроса. –
Понимаю, что Активатор - это техника, которую я частично описал выше. – kskid19