【问题标题】:Generic contraints on derived classes派生类的通用约束
【发布时间】:2008-10-24 12:24:32
【问题描述】:

我有 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&lt;ClassC&gt;.

然而,编译器将允许:

ClassB b = Method<ClassB>();

我的理解是这会失败,因为ClassC 继承了ClassA&lt;ClassB&gt; 而不是ClassA&lt;ClassC&gt;

我真正的问题是,是否可以创建一个派生自 ClassB 的类,以某种方式与泛型方法一起使用?

这似乎是泛型被过度使用了,我同意。我正在尝试创建从单独项目中的亚音速数据对象派生的业务层对象。

注意:我在 中添加了额外的空格,否则它们会从问题中删除。

【问题讨论】:

    标签: c# generics subsonic constraints


    【解决方案1】:

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

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

    这有帮助吗?当然,如果不能更改 Method 也没多大用处...

    【讨论】:

    • 是的,这确实解决了问题。该方法实际上是: DB.Get(string primaryColumnValue) T 用于从数据库中返回一个数据对象。感觉它变得越来越复杂了……我需要退后一步,重新考虑架构。
    【解决方案2】:

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

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

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

    【讨论】:

    • 在这种情况下,这个建议并不能解决这种情况,因为在返回类型 T 的 ClassA 上调用了“方法”方法。不过,感谢您的建议。
    【解决方案3】:

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

    这就是原因。

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

    ClassC 不继承自 ClassA(ClassC)

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

    Generic types are invariant.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 2011-08-31
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多