用泛型实现继承的抽象成员

时间:2011-12-19 21:00:00

标签: c# generics inheritance polymorphism

说我上课了:

abstract class A<T> {
    public abstract void foo(T a);
}

class B : A<int> {
    public void foo(int a) {              //ERROR, signature is not correct
}

在这种情况下如何实现基类?参数的类型应为int。

4 个答案:

答案 0 :(得分:6)

正如其他人所指出的那样,你缺少覆盖关键字。

但是,我想提醒您对这种模式要非常小心。如果你不小心,你可以让自己进入一个受伤的世界:

class B<T>
{
  public virtual void M(T t) {}
  public virtual void M(int x) {}
}
class D : B<int>
{
  public override void M(int x) {}
}

它覆盖了哪一个?

这种情况没有任何好处。 CLR规范建议您永远不要陷入两种方法签名在通用构造下统一的情况。好的建议,那就是。

答案 1 :(得分:4)

您错过了override关键字:

class B : A<int> {
    public override void foo(int a) {
}

如果没有override,编译器需要不同的签名,期望您声明重载

答案 2 :(得分:1)

您需要使用override关键字:

public override void foo(int a) {;}

答案 3 :(得分:0)

abstract class N<T> 
{
    public abstract void foo(T a);
}

class B : N<int>
{
    public override void foo(int a)
    {              
    }
}