C#通过定义基类

我试图找到一种从generics基类派生类的方法。 说:

sealed public class Final : Base{ } public class Base : T where T : Anything { //<- Generics do not allow this } 

在C#中,这似乎不可能。

有没有其他解决方案来实现类似的东西?

我发现了这个StackOverflow问题 ,但它似乎没有解决问题,或者至少我不明白它应该如何解决。

编辑:

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

 Anything[] anything; //Assign some Instances to anything foreach(Final final in anything){ //do something with final } 

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

  Anything[] anything; //Assign some Instances to anything foreach(Final final in anything){ //do something with final } 

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

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


 public class Base : T where T : Anything { … 

让我详细说明这一部分。 我将进一步减少你的例子,只需要class Base : T

这是不可能的,这是有充分理由的。 想象一下:

 class Base : 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() { … } } 

如果允许class Base : T ,你会遇到各种荒谬的情况。

  • Base将是荒谬的,因为Frobble不能在派生类中被覆盖。
  • Base将是荒谬的,因为您无法覆盖基类中不存在的方法。
  • Base不起作用,因为没有Fiddle方法可以调用。
  • Base不起作用,因为您无法调用抽象方法。
  • 只有Base可以使用。

编译器如何知道如何正确编译Base并分析依赖它的代码?

关键是你不能从编译时不知道的类派生。 T是参数,即变量,占位符。 所以class Base : T基本上就像是说Baseinheritance自某些(未知)类” 。 类inheritance是一种类型关系,需要在编译时知道所涉及的两种类型。 (实际上,这不是一个超精确的语句,因为你可以inheritancegenerics类,例如class SpecialList : List 。但至少,派生类必须知道成员(方法,属性,等)可在基类中使用。)

这是你想要的吗?

 sealed public class Final : Base{ } public class Base { } 

如果Final也是generics类,你只能这样做,如下所示:

 public sealed class Final : Base 

然后,您可以将类型限制放在T作为class ,仅允许引用类型为TBase的实例,以仅允许从Base派生的类型:

 public class Base where T : Base