Как вызвать в конструкторе обобщенного класса, унаследованного от обычного, конструктор для обобщенного поля с параметром?
Имеется обычный класс в своем пространстве имен
namespace Common
{
class CommonObject
{
protected int size;
protected CommonObject(int size)
{
this.size = size;
}
}
}
с конструктором, требующим обязательного параметра int size.
У него есть наследники. Обычные:
namespace Calculator
{
class CalculatorObject : Common.CommonObject
{
protected CalculatorObject(int size) : base(size) { }
protected virtual void Calculate() { }
}
}
namespace SuperCalculator
{
class SuperCalculatorObject : Calculator.CalculatorObject
{
protected SuperCalculatorObject(int size) : base(size) { }
protected override void Calculate() { }
}
}
И обобщенный:
namespace Solver
{
class SolverObject<Calc> : Common.CommonObject where Calc : Calculator.CalculatorObject
{
Calc calculator;
protected SolverObject(int size) : base(size)
{
calculator = new Calc(size);
}
protected void Solve()
{
calculator.Calculate;
}
}
}
И ошибка кроется в calc = new Calc (size); - Не удается создать экземпляр переменной типа "Calc", так как у нее отсутствуют ограничения new().
Проблема в том, что конструктор обязательно должен быть с параметром size.
Я понимаю, можно обойтись и без обобщений, просто создав класс SolverObject : Common.CommonObject и дополнительно передать в конструктор экземпляр класса CalculatorObject, но тогда придется его отдельно создавать...
Хотелось бы при создании
SolverObject<SuperCalculatorObject> = new SolverObject<SuperCalculatorObject>(size);
сразу привязывать одно к другому...
Может это всё как-то проще или совсем просто решается?
Ответы (1 шт):
Используйте Activator.CreateInstance().
namespace Solver
{
class SolverObject<T> : Common.CommonObject where T : Calculator.CalculatorObject
{
T calculator;
protected SolverObject(int size) : base(size)
{
calculator = (T)Activator.CreateInstance(typeof(T), size);
}
protected void Solve()
{
calculator.Calculate;
}
}
}