如何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 )。 现在因为这种相似性不对称,所以B与A类似,但A与B不相似。 此外, B和C都可以类似于A (即它们都从A下降)而彼此不相似。
所以你要声明的是,Unlockable类似于与UIWidget相似的所有东西,但这是不可能的,因为类型相似性不是传递性的(即如果B类似于A而C类似于A,则你不能说B类似到C )。
不,那里没有。 但是,我真的不明白你的论点反对让UILockable
从UIWidget
inheritance并将所有调用转发到你的T
:
class UILockable : UIWidget where T : UIWidget { private readonly T t; public void SomeMethod() { this.t.SomeMethod(); } }
你不关心T
的UIWidget
实现的UIWidget
– 只是它是 UIWidget
一个实现。
您不能从Generic类型参数inheritance。 C#是严格类型的语言。 必须在编译时知道所有类型和inheritance层次结构。 .Netgenerics与C ++模板有所不同。
当你确定类型参数T将是UIWidget类型时,那么为什么不从UIWidget本身inheritance。 是否应该允许[假设,只是假设,我知道这将永远不可能]通过从已经是UIWidget类型的Tinheritance您的类将实现什么。 在设计时,你只会对UIWidget进行编码,所以为什么不直接从UIWidgetinheritance。