8

我有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 > 中添加了额外的空格,否则它们会从问题中删除。

4

3 回答 3

7

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

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

这些帮助有用?当然,如果您不能更改方法,那也没多大用处...

于 2008-10-24T12:29:59.947 回答
2

不可以。您必须更改或包装此方法。

这就是原因。

ClassC 继承自 ClassB 继承自 ClassA(ClassB)

ClassC 不继承自 ClassA(ClassC)

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

泛型类型是不变的

于 2008-10-24T12:39:43.377 回答
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;
}

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

于 2008-10-24T12:59:07.393 回答