为什么c#不支持base.base

本文关键字:base 不支持 为什么 | 更新日期: 2023-09-27 18:10:35

我测试的代码是这样的:

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类的Test(祖父母的方法)。但这行不通。请告诉我如何调用父类虚拟方法

为什么c#不支持base.base

你不能-因为它会违反封装。如果类B想在Test上强制某种不变量(或其他什么),如果类C可以绕过它,那将是相当可怕的。

如果你发现自己想要这样,你应该质疑你的设计——也许你的继承关系中至少有一个是不合适的?(我个人倾向于组合而不是继承,但这是一个单独的讨论。)

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

class B : A
{
    public B() { }
    public override void Test()
    {
        Console.WriteLine("I am B!");
        base.Test();
    }
    protected void TestFromA()
    {
        base.Test()
    }
}
在C
中使用TestFromA()