使用抽象覆盖并调用基类

时间:2013-10-04 04:14:07

标签: c#

考虑以下内容 -

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方法。

3 个答案:

答案 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?