派生类的通用约束

时间:2008-10-24 12:24:32

标签: c# generics subsonic constraints

我有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的类,可以通过某种方式使用泛型方法?

这可能看起来仿制药过度使用,我同意。我正在尝试创建从单独项目中的亚音速数据对象派生的业务层对象。

注意:我已经把&lt; T>如果有额外的空格,他们就会被剥夺。

3 个答案:

答案 0 :(得分:6)

好吧,您可以将Method更改为:

public static T Method<T,U>() where T : ClassA<U> where U : T

这有帮助吗?如果你不能改变当然的方法,那就没什么用了......

答案 1 :(得分:2)

没有。您必须更改或包装此方法。

原因就在这里。

ClassC继承自继承自ClassA(ClassB)

的ClassB

ClassC不继承ClassA(ClassC)

ClassB的子级不会继承ClassA(子类),因为它们继承自ClassB而ClassB不继承自ClassA(子类)。

Generic types are invariant

答案 2 :(得分:1)

在大多数情况下,可以通过使用基本非泛型抽象类来解决此问题:

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;
}

但您的里程可能会有所不同。