在C#4.0中,是否可以从泛型类型参数派生类?
我一直在尝试,但我似乎不明白。我想这样做在C#4.0中,是否可以从泛型类型参数派生类?,c#,generics,inheritance,subclass,derived-class,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
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());
}
公共抽象类SingletonType:TBaseClass
其中:TBaseClass,new()
其中TBaseClass:class
{
静态齐格尔顿(singleton),;
公营单亲家庭
=>_singleton??(_singleton=new TSingleton());
}
计划是这样使用它,它将有点“包装”围绕基类的单例模式
public class SingletonFoo : SingletonType<SingletonFoo, Foo> {
}
public类SingletonFoo:SingletonType{
}
然而,我一直在得到这个
无法从“TBaseClass”派生,因为它是类型参数
嗯。。。我以为类型正是你从中衍生出来的
那么我错过了什么
注意:这当然是一个简单的例子,因为它没有添加任何有用的内容,但是假设
SingletonType
有许多其他逻辑与问题无关,因此忽略了关注手头的问题。不,这是不可能的。例如,以声明为密封的
类型为例。您不能从该类继承,并且没有限制为非密封类型的约束,因此尝试通过泛型参数从该类继承是不可能的 即使涉及泛型,每个类型都有一个实的、离散的父类。即使在处理开放泛型类型(例如,typeof(List)
)时,仍然可以找到父类
如果你想要的是允许的,这不是真的,<代码> Type(SuntLoNoType )不会有父类型,这是不允许的。
C++中的泛型类型不是C++模板;记住,泛型类型必须适用于所有可能的类型参数。模板只需要为实际构建的结构起作用。
这个问题是重复的,请看我的答案 关于这一点的更多想法。基本上,简短的回答是,可观的成本不会超过该功能的小好处。如果您不喜欢这个答案,请参阅我的第二个答案: 如果你也不喜欢这个答案,请参见后续问题:不,这是不可能的,因为假设你有这门课:
类栏{
int-example=0;
}
下面是我们的类型参数类:
类foo:T{
int-example=5;
}
如果我们创建了一个类型为
foo
的变量,那么example
就会混淆。你说,“嗯……我以为类型正是你从中派生出来的!”-是的,但请再次阅读消息。它说的是“类型参数”,而不是“类型”。这是一个区别。然而,在使用类型(例如“public static T”)的泛型中,您可以在任何地方使用该“Type参数”,那么使用它的方式与将其用作返回类型有什么不同呢?(到目前为止,@Tejs似乎最具洞察力。)也许值得注意的是,与继承相比,这里的构图将是理想的。@Mohamed Nuur,想详细说明一下吗?(…或者任何人都可以?)不知道你的意思。可能重复的好,这并不能真正解释为什么-编译器可以不允许使用MyType
,其中X
是密封类型,而不是完全不允许声明MyType:t
。当然,答案仍然是“不可能”:,为什么泛型参数必须对允许的所有类型有效;例如,new()
约束允许您编写T sample=new T()
,因为否则您的泛型参数可能是int
,而这是无效的代码。如果没有nosealed
约束,用sealed继承某个东西将违反C#spec。因为不是所有的案例对类型都有效,并且不存在约束,所以它是无效的。错误消息是编译器不允许这种情况发生=DNo,表面原因是规范说基类型不能是类型参数,句号。您试图提供的深层次原因是规范是以这种方式编写的。你没有对此做出解释。(顺便说一句,int
确实有一个默认构造函数,因此与所有值类型一样满足new()
约束。)@MarqueIV:你的评论毫无意义。没有对象
约束。也许你的意思是class
,但是你的评论是错误的:你可以有一个new()
约束而没有class
约束。它怎么会混淆呢?”Bar'有一个类型参数,而不是基类。它们完全不相关并且在不同的范围内。@MarqueIV No,因为T
是foo
的bar
类型。由于foo
类继承自T
类(bar
),因此示例
可能是0
或5
。很抱歉,这是错误的。它们的范围完全不同。您可以从泛型的实例访问一个示例,而从泛型中通过T定义的任何实例变量访问另一个示例。它们不是同一回事。您似乎不理解继承在C#中是如何工作的example
在bar
中是私有的,因此来自bar
的派生类可以声明自己的example
而不会出现问题。即使example
不是私有的,那么foo
的example
也会被视为新的。哦,我明白了,很抱歉打扰您