C#通过<T>定义基类

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)

sta*_*ica 7

我想得到的结果是能够做到这样的事情:

 Anything[] anything;
 //Assign some Instances to anything 

 foreach(Final final in anything){
     //do something with final
 }
Run Code Online (Sandbox Code Playgroud)

你的foreach循环表明:class Anything : Final { … }.

这显然会在您计划和命名时转变继承层次结构.(你的继承关系中不能有循环).


public class Base<T> : T where T : Anything { …
Run Code Online (Sandbox Code Playgroud)

让我详细说明这一部分.我会进一步减少你的例子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>.但至少,派生类必须知道基类中可用的成员(方法,属性等). )