考虑以下内容 -
void Main()
{
var c = new C();
c.Print();
}
public abstract class A
{
public virtual void Print()
{
Console.WriteLine("I'm in A!");
}
}
public abstract class B : A
{
public abstract override void Print();
}
public class C : B
{
public override void Print()
{
Console.WriteLine("I'm in C!");
base.Print();
}
}
当然,这不会编译,因为它认为我试图调用B的print方法,这是抽象的。我想要做的是调用C的打印方法,然后让它调用base的print方法,该方法将“链接”回A的打印方法。我希望输出为 -
I'm in C!
I'm in A!
这样做甚至可能吗?我做错了什么?
编辑:我想补充一点,关于上面代码的主要观点是我试图强迫任何扩展B的人实现他们自己的Print方法。
答案 0 :(得分:2)
嗯,你可以做到
public abstract class A
{
public virtual void Print()
{
Console.WriteLine("I'm in A!");
}
}
public abstract class B : A
{
public override void Print()
{
base.Print();
}
}
public class C : B
{
public override void Print()
{
Console.WriteLine("I'm in C!");
base.Print();
}
}
哪个是有效的
public abstract class A
{
public virtual void Print()
{
Console.WriteLine("I'm in A!");
}
}
public abstract class B : A
{
}
public class C : B
{
public override void Print()
{
Console.WriteLine("I'm in C!");
base.Print();
}
}
答案 1 :(得分:1)
如果您从B
删除了覆盖的尝试:
public abstract override void Print();
这正是它将要做的。
完整代码:
static void Main(string[] args)
{
var c = new C();
c.Print();
Console.ReadLine();
}
public abstract class A
{
public virtual void Print()
{
Console.WriteLine("I'm in A!");
}
}
public abstract class B : A
{
}
public class C : B
{
public override void Print()
{
Console.WriteLine("I'm in C!");
base.Print();
}
}
<强>结果:强>
I'm in C!
I'm in A!
答案 2 :(得分:1)
你无法强制一个类提供它自己的实现,毕竟它只能调用base.Print()
或甚至只提供一个空方法实现。
对于类似的讨论,请参阅: How to force overriding a method in a descendant, without having an abstract base class?