如何inheritancegenerics参数?

我基本上想要这样做:

class UILockable : T where T : UIWidget { } 

但是,这不起作用。 我见过人们建议你这样做:

 class UILockable where T : UIWidget { private T _base; } 

这将要求我覆盖UILockable需要的每个函数并将其转发给T.这是不可能的,因为T可能来自UIWidget并且具有自己独特的抽象/虚拟方法。

有没有办法简单地从Tinheritance?

您不能从generics类型参数inheritance。 C#generics与C ++模板有很大不同。 inheritance类型参数要求类具有基于类型参数的完全不同的表示,这不是.NETgenerics所发生的。 它们在IL和本机级别上是相同的(对于所有引用类型参数)。

用这种方式考虑一下:当Type Binheritance自A类时 ,你声明B 类似于 A (其中相似性意味着你可以在任何你想要使用A的地方使用B )。 现在因为这种相似性不对称,所以BA类似,但AB不相似。 此外, BC都可以类似于A (即它们都从A下降)而彼此不相似。

所以你要声明的是,Unlockable类似于与UIWidget相似的所有东西,但这是不可能的,因为类型相似性不是传递性的(即如果B类似于AC类似于A,则你不能说B类似到C )。

不,那里没有。 但是,我真的不明白你的论点反对让UILockableUIWidgetinheritance并将所有调用转发到你的T

 class UILockable : UIWidget where T : UIWidget { private readonly T t; public void SomeMethod() { this.t.SomeMethod(); } } 

你不关心TUIWidget实现的UIWidget – 只是它 UIWidget一个实现。

您不能从Generic类型参数inheritance。 C#是严格类型的语言。 必须在编译时知道所有类型和inheritance层次结构。 .Netgenerics与C ++模板有所不同。

当你确定类型参数T将是UIWidget类型时,那么为什么不从UIWidget本身inheritance。 是否应该允许[假设,只是假设,我知道这将永远不可能]通过从已经是UIWidget类型的Tinheritance您的类将实现什么。 在设计时,你只会对UIWidget进行编码,所以为什么不直接从UIWidgetinheritance。