繁体   English   中英

使用抽象覆盖并调用基类

[英]Using abstract override and calling the base class

考虑以下 -

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的print方法,然后让它调用base的print方法,它将“链接”回A的print方法。 我希望输出是-

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()甚至只是提供一个空的方法实现。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM