Почему C # не поддерживает base.base? - PullRequest
9 голосов
/ 04 октября 2011

Я тестировал код следующим образом:

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 ]

14 голосов
/ 04 октября 2011

Вы не можете - потому что это нарушит инкапсуляцию.Если класс B хочет применить какой-то инвариант (или что-то еще) к Test, было бы довольно мрачно, если бы класс C мог просто обойти это.

Если вы обнаружите, что хотите этого, вы должны поставить под сомнение свой дизайн -возможно, хотя бы одно из ваших наследственных отношений неуместно?(Лично я пытаюсь для начала отдать предпочтение композиции, а не наследованию, но это отдельное обсуждение.)

5 голосов
/ 04 октября 2011

Один из вариантов - определить новый метод в B, как показано ниже

class B : A
{
    public B() { }

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

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

и используйте TestFromA() в C

...