如何继承泛型参数?

时间:2010-06-15 18:12:56

标签: c#

我基本上想要这样做:

class UILockable<T> : T
    where T : UIWidget
{
}

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

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

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

有没有办法简单地继承T?

4 个答案:

答案 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继承。