繁体   English   中英

派生类的通用约束

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM