我知道不可能从泛型类型参数继承,但是在为抽象类型的衍生物实现公共代理时它会很方便:-)
有谁知道为什么这是不可能的?
示例C#:
abstract class Foo
{
public virtual void Bar()
{
// nop
}
}
class FooProxy<TFoo> : TFoo
where TFoo : Foo
{
public override void Bar()
{
// do some stuff before
base.Bar();
// do some stuff after
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:一些代码来说明如何使用它的示例.考虑以下Foo的衍生物:
class FooX : Foo
{
public string X { get; set; }
public override void Bar()
{
Console.WriteLine("Doing Bar X");
}
}
class FooY : Foo
{
public string Y { get; set; }
public override …Run Code Online (Sandbox Code Playgroud) 我一直在尝试这个,但我似乎无法解决这个问题.我想做这个...
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());
}
Run Code Online (Sandbox Code Playgroud)
计划是像这样使用它,它可以在基类周围"包裹"单例模式......
public class SingletonFoo : SingletonType<SingletonFoo, Foo> {
}
Run Code Online (Sandbox Code Playgroud)
但是,我一直这样做
无法从'TBaseClass'派生,因为它是一个类型参数
嗯...我想类型为你到底是什么做的派生!
那我错过了什么?
注意:这当然是一个简单的例子,因为它没有添加任何有用的东西,但是假设SingletonType有许多其他逻辑与问题无关,因此忽略了关注手头的问题.
这篇文章是在延续这一个.
我试图了解我是否是唯一一个错过并需要.NET泛型类型的人才能继承其通用参数类型的人.
挑战是收集有利于此功能的令人信服的理由,或者,知道没有.
我有理由把它作为这个问题的答案 - 见下文.
我要求那里的人添加他们作为这篇文章的答案.
如果你不同意这个功能是有用的或者没有充分的理由支持 - 请不要在这里发布任何内容,尽管你可以在已经启动它的原始帖子中这样做 - 在这里.
PS
一些C++模式在.NET中无关紧要.例如,在他的优秀书籍Modern C++ Design中, Andrei Alexandrescu描述了如何创建在编译时评估的类型列表.当然,这种模式与.NET无关,如果我需要一个类型列表,我只需创建List<Type>并用类型填充它.因此,让我们尝试提出与.NET框架相关的原因,而不是盲目地将C++编码技术转换为C#.
PPS
当然,这个讨论严格来说是学术性的.即使有问题的一百个令人信服的理由浮出水面,它也不会被实施.
我可以
public class MyGenericClass : DL
//but i cannot do
public class MyGenericClass <T> : T
Run Code Online (Sandbox Code Playgroud)
我怎么做第二个?如果我不能那样做,我该怎么办呢
public class MyGenericClass <T>
{
T obj;
//have all MyGenericClass.XYZ call obj.XYZ
}
Run Code Online (Sandbox Code Playgroud) 请考虑以下通用方法:
public T2 Frob<T1, T2>(T1 item)
where T1 : class, T2
=> item as T2;
Run Code Online (Sandbox Code Playgroud)
编译器将拒绝编译此代码; 类型参数'T2'不能与'as'运算符一起使用,因为它没有类类型约束,也没有'class'约束
好的,这很容易解决,只需:
public T2 Frob<T1, T2>(T1 item)
where T1 : class, T2
where T2 : class
=> item as T2;
Run Code Online (Sandbox Code Playgroud)
但这不是多余的吗?有没有可能T2不class考虑已经存在的限制T1?
我的问题不是为什么这个"推理"没有在编译器中实现,原因可能只是"没有人想到它",那没关系.我更感兴趣的是,我知道我的推理是否正确,T2并且在所有情况下都限制class在第一个例子中,即使它没有明确强制执行.