Почему 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()
в С