2

考虑以下 -

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

I'm in C!
I'm in A!

这样做甚至可能吗?我究竟做错了什么?

编辑:我想补充一点,关于上面代码的要点是我试图强迫任何扩展 B 的人实现他们自己的 Print 方法。

4

3 回答 3

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();
    }
}
于 2013-10-04T04:21:28.337 回答
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!
于 2013-10-04T04:19:34.867 回答
1

没有办法强制一个类提供它自己的实现,毕竟它只能调用base.Print()甚至只是提供一个空的方法实现。

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

于 2013-10-04T04:24:34.180 回答