使用抽象重写并调用基类

本文关键字:调用 基类 重写 抽象 | 更新日期: 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(),甚至只是一个空的方法实现。

有关类似的讨论,请参阅:如何在没有抽象基类的情况下强制重写后代中的方法?