[英]In C# 4.0, is it possible to derive a class from a generic type parameter?
我一直在尝试这个,但我似乎无法弄清楚这一点。 我想做这个...
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());
}
计划是像这样使用它,它将 singleton 模式“包裹”在基础 class 周围......
public class SingletonFoo : SingletonType<SingletonFoo, Foo> {
}
但是,我不断收到这个
无法从“TBaseClass”派生,因为它是类型参数
嗯...我认为类型正是您从中派生的!
那么我错过了什么?
注意:这当然是一个微不足道的例子,因为它没有添加任何有用的东西,但假设SingletonType
有很多与问题无关的其他逻辑,因此省略了关注手头的问题。
C# 中的泛型类型不是 C++ 模板; 请记住,泛型类型必须适用于所有可能的类型 arguments。 模板只需要适用于您实际制作的结构。
这个问题是重复的; 看我的回答
为什么 C# generics 不能像在 C++ 模板中那样从泛型类型参数之一派生?
有关此的更多想法。 基本上,简短的回答是,可观的成本并没有超过该功能的小好处。 如果您不喜欢该答案,请参阅我的第二个答案:
为什么 C# generics 不能像在 C++ 模板中那样从泛型类型参数之一派生?
如果您也不喜欢这个答案,请参阅后续问题:
不,这是不可能的。 例如,采用声明为sealed
的类型。 您不能从该 class 继承,并且没有限制非密封类型的限制,因此尝试通过泛型参数从它继承是不可能的。
即使涉及 generics,每种类型都恰好有 1 个真实的离散父 class。 即使在处理开放的泛型类型(例如typeof(List<>)
)时,您仍然可以找到父 class。
如果你想要的东西被允许,这不会是真的, typeof(SingletonType<,>
不会有父类型,这是不允许的。
不,这是不可能的,因为假设你有这个 class:
class bar {
int example = 0;
}
现在这是我们的类型参数 class:
class foo<T> : T {
int example = 5;
}
如果我们创建了一个foo<bar>
类型的变量,那么example
就会混淆。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.