我有一个继承链,它由三个类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";
}
}
答案 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";
}