我基本上想要这样做:
class UILockable<T> : T
where T : UIWidget
{
}
然而,这不起作用。我见过人们建议你这样做:
class UILockable<T>
where T : UIWidget
{
private T _base;
}
这将要求我覆盖UILockable需要的每个函数并将其转发给T.这是不可能的,因为T可能来自UIWidget并且拥有自己独特的抽象/虚拟方法。
有没有办法简单地继承T?
答案 0 :(得分:20)
您无法继承泛型类型参数。 C#泛型与C ++模板非常不同。继承type参数要求类具有基于类型参数的完全不同的表示,这不是.NET泛型所发生的。它们在IL和本机级别上是相同的(对于所有引用类型参数)。
答案 1 :(得分:3)
不,没有。但是,我并不理解你反对UILockable<T>
继承UIWidget
并将所有来电转发到T
的论点:
class UILockable<T> : UIWidget
where T : UIWidget
{
private readonly T t;
public void SomeMethod()
{
this.t.SomeMethod();
}
}
您并不关心T
UIWidget
实施的具体细节 - 只是 是UIWidget
的实现。
答案 2 :(得分:3)
以这种方式思考: 当类型 B 继承自 A 类型时,您声明 B 类似 A < / em>(其中,相似性意味着您可以在任何您希望使用 A 的地方使用 B )。现在因为这种相似性不对称,你有 B 类似于 A 但 A 与 B 不相似。此外, B 和 C 都可以类似于 A (即它们都来自 A )而不是相似的对彼此。
所以你要声明的是Unlockable类似于与UIWidget类似的所有东西,但这是不可能的,因为类型相似性不是传递性的(即,如果 B 类似于 A < / em>和 C 类似于 A ,你不能说 B 类似于 C )。< / p>
答案 3 :(得分:0)
您不能从Generic类型参数继承。 C#是严格类型的语言。必须在编译时知道所有类型和继承层次结构。 .Net泛型与C ++模板有所不同。
当你确定类型参数T将是UIWidget类型时,那么为什么不从UIWidget本身继承。是否应该允许[假设,只是假设,我知道这将永远不可能]通过从已经是UIWidget类型的T继承您的类将实现什么。在设计时,你只会对UIWidget进行编码,所以为什么不直接从UIWidget继承。