Почему C# не поддерживает base.base?

Я тестировал код так:

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 метод Test класса A (метод дедушки и бабушки). Но это не работает. Пожалуйста, скажите мне, как вызвать дедушку виртуальный метод.

2 ответа

Вы не можете - потому что это нарушит инкапсуляцию. Если класс 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()
    }
}

и использовать TestFromA() в С

Другие вопросы по тегам