C#重写一个基类方法多个派生类向下继承链

时间:2010-11-23 01:02:01

标签: c# inheritance override virtual

我有一个继承链,它由三个类A,B和C组成,其中A和B是抽象的,C是B的具体实现。

我在基础抽象类A,Foo()上有一个虚拟方法,我想在具体的类C中覆盖它。

如果我尝试在C类中覆盖它,它永远不会被拾取并始终使用默认的基类实现,但如果我在B& C,它只使用虚拟方法的B.Foo()实现。

除了'覆盖'之外,我是否必须在B.Foo()上声明一些额外的东西?

显然这些是我的类的简化版本,但这是我的方法声明:

abstract class A {
  protected virtual string Foo() {
    return "A";
  }
}

abstract class B : A {
  protected override string Foo() {
    return "B";
  }
}

class C : B {
  protected override string Foo() {
    return "C";
  }
}

2 个答案:

答案 0 :(得分:5)

咦?

void Main()
{
    new C().DumpFoo(); // C
    A x=new C();
    x.BaseDumpFoo(); //C
}

abstract class A {
  protected virtual string Foo() {
    return "A";
  }
  public void BaseDumpFoo()
  {
    Console.WriteLine(Foo());
  }
}

abstract class B : A {
  protected override string Foo() {
    return "B";
  }
}

class C : B {
  protected override string Foo() {
    return "C";
  }
  public void DumpFoo()
  {
    Console.WriteLine(Foo());
  }
}

输出为C。从Foo移除B实施,输出仍为C

答案 1 :(得分:-3)

问题是,由于B覆盖了该方法,当从C调用它时,它永远不会到达继承层次结构中的实现。 您需要做的是将B中的方法定义为new(以便它覆盖A中的实现)并将其定义为虚拟(以便C可以使用它自己的实现) 你会有这样的东西

abstract class A
{
    protected virtual string Foo()
    {
        return "A";
    }
}

abstract class B : A
{
    protected new virtual string Foo()
    {
        return "B";
    }
}

class C : B
{
    protected override string Foo()
    {
        return "C";
    }