[英]Generic contraints on derived classes
我有A班:
public class ClassA<T>
B类来自A:
public class ClassB : ClassA<ClassB>
C类来自B类:
public class ClassC : ClassB
现在我有一个带约束的泛型方法
public static T Method<T>() where T : ClassA<T>
好的,现在我想打电话:
ClassC c = Method<ClassC>();
但我得到编译错误说: Type argument 'ClassC' does not inherit from or implement the constraint type 'ClassA<ClassC>.
然而,编译器将允许:
ClassB b = Method<ClassB>();
我的理解是,这失败了,因为ClassC
继承了ClassA<ClassB>
而不是ClassA<ClassC>
我真正的问题是,是否有可能创建一个派生自ClassB
的类,可以通过泛型方法以某种方式使用它?
这可能看起来仿制药过度使用,我同意。 我正在尝试创建从单独项目中的亚音速数据对象派生的业务层对象。
注意:我已经为<T>添加了额外的空格,否则它们会从问题中删除。
好吧,您可以将Method更改为:
public static T Method<T,U>() where T : ClassA<U> where U : T
这些帮助有用? 如果你不能改变方法当然没用多少......
不可以。您必须更改或包装此方法。
这就是原因。
ClassC继承自继承自ClassA(ClassB)的ClassB
ClassC不继承ClassA(ClassC)
ClassB的子级都不会从ClassA(子类)继承,因为它们继承自ClassB,而ClassB不继承自ClassA(子类)。
通用类型是不变的 。
在大多数情况下,可以通过使用基本非泛型抽象类来解决此问题:
public abstract class BasicClassA
{
}
public class ClassA<T> : BasicClassA
{
}
public class ClassB : ClassA<ClassB>
{
}
public class ClassC : ClassB
{
}
public static T Method<T>() where T : BasicClassA
{
return null;
}
不过,您的里程可能有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.