使用抽象重写并调用基类
本文关键字:调用 基类 重写 抽象 | 更新日期: 2023-09-27 18:34:02
考虑以下事项 -
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 的打印方法,这是抽象的。我想做的是调用 C 的打印方法,然后让它调用 base 的打印方法,这将"链接"回 A 的打印方法。我希望输出是 -
I'm in C!
I'm in A!
这样做可能吗?我做错了什么?
编辑:我想补充一点,关于上述代码的要点是,我试图强迫任何扩展B的人实现他们自己的Print方法。
好吧,你可以这样做
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();
}
}
如果从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!
你不可能强制一个类提供它自己的实现,毕竟它可以只调用base.Print()
,甚至只是一个空的方法实现。
有关类似的讨论,请参阅:如何在没有抽象基类的情况下强制重写后代中的方法?