C#重写基类方法继承链上的多个派生类

C#重写基类方法继承链上的多个派生类,c#,inheritance,overriding,virtual,C#,Inheritance,Overriding,Virtual,我有一个由三个类A、B和C组成的继承链,其中A和B是抽象的,C是B的具体实现 我在基础抽象类a上有一个虚拟方法,Foo(),我想在具体类C中重写它 如果我尝试只在类C中重写,它将永远不会被拾取,并且始终使用默认的基类实现,但是如果我同时在B&C中重写,它将只使用虚拟方法的B.Foo()实现 我是否必须在B.Foo()上声明除“override”之外的其他内容 显然,这些是我的类的简化版本,但下面是我的方法声明: abstract class A { protected virtual str

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

我在基础抽象类a上有一个虚拟方法,
Foo()
,我想在具体类C中重写它

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

我是否必须在B.Foo()上声明除“override”之外的其他内容

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

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
。从
B
中删除
Foo
实现,输出仍然是
C
问题在于,由于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";
    }

您是否尝试过测试类的简化版本?您如何调用Foo()在C类?我尝试使用您的样本进行复制,但失败了。由于其他错误,我也遇到了同样的问题。一旦这些错误被修复,我重新构建错误就消失了。事实上,我应该尝试更仔细地阅读。由于
A
声明为抽象,我不确定所描述的案例是如何复制的。+1
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";
    }