Noe*_*mer 4 c# generics inheritance dynamic
我试图找到一种从泛型基类派生类的方法.说:
sealed public class Final : Base<Something>
{
}
public class Base<T> : T
where T : Anything // <-- Generics do not allow this
{
}
Run Code Online (Sandbox Code Playgroud)
在C#中,这似乎不可能.
有没有其他解决方案来实现类似的东西?
我发现了这个StackOverflow问题,但它似乎没有解决问题,或者至少我不明白它应该如何解决.
编辑:
我想得到的结果是能够做到这样的事情:
Anything[] anything;
//Assign some Instances to anything
foreach(Final final in anything){
//do something with final
}
Run Code Online (Sandbox Code Playgroud)
我想得到的结果是能够做到这样的事情:
Run Code Online (Sandbox Code Playgroud)Anything[] anything; //Assign some Instances to anything foreach(Final final in anything){ //do something with final }
你的foreach循环表明:class Anything : Final { … }.
这显然会在您计划和命名时转变继承层次结构.(你的继承关系中不能有循环).
Run Code Online (Sandbox Code Playgroud)public class Base<T> : T where T : Anything { …
让我详细说明这一部分.我会进一步减少你的例子class Base<T> : T.
这是不可能的,这是有充分理由的.想象一下:
class Base<T> : T
{
public override string Frobble()
{
Fiddle();
return "*" + base.Frobble() + "*";
}
}
class A
{
public sealed string Frobble() { … }
}
class B
{
}
class C
{
public virtual string Frobble() { … }
}
abstract class D
{
public abstract void Fiddle();
public virtual string Frobble() { … }
}
class E
{
public void Fiddle() { … }
public virtual string Frobble() { … }
}
Run Code Online (Sandbox Code Playgroud)
如果class Base<T> : T被允许,你会得到各种荒谬的情况.
Base<A>将是荒谬的,因为Frobble无法在派生类中重写.Base<B> 将是荒谬的,因为您不能覆盖基类中不存在的方法. Base<C>不起作用,因为没有Fiddle方法可以调用.Base<D> 因为你不能调用抽象方法而无法工作.Base<E>工作.编译器如何知道如何正确编译Base<T>和分析依赖它的代码?
关键是你不能从编译时不知道的类派生.T是一个参数,即一个变量,一个占位符.所以class Base<T> : T基本上就像是说" Base<T>从某些(未知)类继承".类继承是一种类型关系,需要在编译时知道所涉及的两种类型.(实际上,这不是一个超精确的语句,因为你可以从泛型类继承,例如class SpecialList<T> : List<T>.但至少,派生类必须知道基类中可用的成员(方法,属性等). )