У меня есть два класса, базовый класс и дочерний класс. В базовом классе я определяю универсальный виртуальный метод:
protected virtual ReturnType Create<T>() where T : ReturnType {}
Затем в моем дочернем классе я пытаюсь сделать это:
protected override ReturnTypeChild Create<T>() // ReturnTypeChild inherits ReturnType { return base.Create<T> as ReturnTypeChild; }
Visual Studio дает эту странную ошибку:
The type 'T' cannot be used as type parameter 'T' in the generic type or method 'Create()'. There is no boxing conversion or type parameter conversion from 'T' to 'ReturnType'.
Повторение, где пункт на переопределении ребенка также дает ошибку:
Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly
Таким образом, что я делаю неправильно здесь?
Это работает. Вы должны были сделать тип возвращаемого значения универсальным:
public class BaseClass {
public virtual T Create<T>() where T : BaseClass, new() {
var newClass = new T();
//initialize newClass by setting properties etc
return newClass;
}
}
public class DerivedClass : BaseClass {
public override T Create<T>() {
var newClass = base.Create<T>();
//initialize newClass with DerivedClass specific stuff
return newClass;
}
}
void Test() {
DerivedClass d = new DerivedClass() ;
d.Create<DerivedClass>();
}
Вот некоторые основные правила переопределения C # :
Переопределенный базовый метод должен иметь та же подпись, что и переопределение метод.
Это означает тот же возвращаемый тип и те же аргументы метода.
Ваше переопределение не может изменить тип возвращаемого значения, даже если тип возвращаемого значения является производным от типа возвращаемого значения метода базового класса. Вы должны сделать что-то вроде того, что сделал Игорь выше, и сделать возвращаемый тип универсальным.