在C#4.0中,是否可以从泛型类型参数派生类?

时间:2011-05-04 22:17:46

标签: c# generics inheritance subclass derived-class

我一直在尝试这个,但我似乎无法弄清楚这一点。我想这样做......

public abstract class SingletonType<TSingleton, TBaseClass> : TBaseClass
    where TSingleton : TBaseClass, new()
    where TBaseClass : class
{
    static TSingleton _singleton;
    public static TSingleton Singleton
        => _singleton ?? (_singleton = new TSingleton());
}

计划是像这样使用它,它会将单个模式“包裹”在基类周围......

public class SingletonFoo : SingletonType<SingletonFoo, Foo> {
}

然而,我一直在接受这个

  

无法从'TBaseClass'派生,因为它是一个类型参数

嗯......我认为类型正是你派生的东西!

那么我错过了什么?

注意:这当然是一个简单的例子,因为它没有添加任何有用的东西,但假设SingletonType有许多与问题无关的其他逻辑,因此它被忽略,专注于手头的问题。

4 个答案:

答案 0 :(得分:25)

C#中的泛型类型不是C ++模板;请记住,泛型类型必须适用于所有可能的类型参数。模板只需要适用于您实际构建的结构。

这个问题是重复的;看到我对

的回答

Why cannot C# generics derive from one of the generic type parameters like they can in C++ templates?

有关此问题的更多想法。基本上,简短的回答是,相当大的成本并没有超过该功能的小优势。如果您不喜欢这个答案,请参阅我的第二个答案:

Why cannot C# generics derive from one of the generic type parameters like they can in C++ templates?

如果您不喜欢这个答案,请参阅后续问题:

What are the good reasons to wish that .NET generics could inherit one of the generic parameter types?

答案 1 :(得分:18)

不,这是不可能的。例如,采用声明为sealed的类型。你不能从该类继承,并且没有约束限制非密封类型,ergo试图通过泛型参数继承它是不可能的。

答案 2 :(得分:1)

即使涉及泛型,每种类型也只有1个真正的离散父类。即使在处理开放泛型类型(例如typeof(List<>))时,您仍然可以找到父类。

如果您想要的是允许的,那么这不是真的,typeof(SingletonType<,>不会有父类型,并且这是不允许的。

答案 3 :(得分:0)

不,这是不可能的,因为假设您拥有此类:

class bar {
  int example = 0;
}

现在这是我们的类型参数类:

class foo<T> : T {
  int example = 5;
}

如果我们创建了foo<bar>类型的变量,那么example将会变得混乱。