为什么C#不支持base.base?

时间:2011-10-04 13:47:23

标签: c# .net inheritance grandchild

我测试了这样的代码:

class A
{
    public A() { }

    public virtual void Test ()
    {
        Console.WriteLine("I am A!");
    }
}

class B : A
{
    public B() { }

    public override void Test()
    {
        Console.WriteLine("I am B!");
        base.Test();
    }
}

class C : B
{
    public C() { }

    public override void Test()
    {
        Console.WriteLine("I am C!");
        base.base.test(); //I want to display here "I am A"
    }
}

并尝试从C类方法调用A类(祖父母的方法)。但它不起作用。请告诉我一种调用祖父母虚拟方法的方法。

2 个答案:

答案 0 :(得分:14)

你不能 - 因为它会违反封装。如果B类想要在Test上强制执行某种不变(或其他),那么如果C类可以绕过它就会非常严峻。

如果你发现自己想要这个,你应该质疑你的设计 - 或许你的继承关系中至少有一个是不合适的? (我个人试图从组合而不是继承开始,但这是一个单独的讨论。)

答案 1 :(得分:5)

一种选择是在B中定义一个新方法,如下所示

class B : A
{
    public B() { }

    public override void Test()
    {
        Console.WriteLine("I am B!");
        base.Test();
    }

    protected void TestFromA()
    {
        base.Test()
    }
}

并在C

中使用TestFromA()