【问题标题】:C# Overriding a base class method more than one derived class down inheritance chainC#在继承链中覆盖多个派生类的基类方法
【发布时间】:2011-05-14 04:47:40
【问题描述】:

我有一个由三个类 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";
  }
}

【问题讨论】:

  • 您是否尝试过测试您的课程的简化版本?
  • 你是如何在 C 类上调用 Foo() 的?我尝试使用您的样本进行复制,但未能成功。
  • 由于其他错误,我遇到了同样的问题。一旦这些被修复,我重建错误就消失了。

标签: c# inheritance overriding virtual


【解决方案1】:

嗯?

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。从B 中删除Foo 实现,输出仍然是C

【讨论】:

  • 确实,我应该尝试更仔细地阅读内容。将A 声明为抽象,我不确定所描述的情况如何可重现。 +1
【解决方案2】:

问题在于,由于 B 覆盖了该方法,因此当从 C 调用它时,它永远不会到达其在继承层次结构中的实现
您需要做的是将 B 中的方法定义为新的(以便它覆盖 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";
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 2012-05-08
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    相关资源
    最近更新 更多