我有两个类,一个基类和一个子类.在基类中,我定义了一个通用的虚方法:
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'.
重复子项覆盖的where子句也会出错:
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>();
}
Run Code Online (Sandbox Code Playgroud)
这些是一些基本的C# 覆盖规则:
重写的基方法必须与重写方法具有相同的签名。
这意味着相同的返回类型和相同的方法参数。
| 归档时间: |
|
| 查看次数: |
1140 次 |
| 最近记录: |