派生类的通用约束

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>();

但是我收到了编译错误,提示:

类型参数“ClassC”不继承或实现约束类型“ClassA<ClassC>”。

然而,编译器会允许以下代码:

ClassB b = Method<ClassB>();

我的理解是这个失败了,因为ClassC继承自ClassA<ClassB>而不是ClassA<ClassC> 我的真正问题是,是否可能创建一个从ClassB派生的类,并以某种方式与通用方法一起使用?
这似乎是滥用泛型,我同意。我正在尝试创建业务层对象,这些对象从单独的项目中的subsonic数据对象派生而来。
注意:我已经在< T >中添加了额外的空格,否则它们会被从问题中删除。
3个回答

7

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

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

这有帮助吗?如果您无法更改方法,那么它就没有太大用处......


是的,这确实解决了问题。方法实际上是: DB.Get< T >(string primaryColumnValue) T 用于从数据库返回数据对象。感觉它变得比必要的复杂...我需要退一步,重新考虑架构。 - ptutt

2

不行。你必须更改或包装此方法。

原因如下。

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

ClassC不继承自ClassA(ClassC)

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

泛型类型是不变的


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

虽然你的结果可能会有所不同。


在这种情况下,该建议并不能解决问题,因为在“Method”中调用了返回类型T的ClassA<T>的方法。感谢您的建议。 - ptutt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接