Что выведет код Middle ООП в C# обновлено

virtual, override и new в цепочке

Вопрос

Что выведет программа (.NET 8)? По строке на каждый вывод.

A x = new C();
B y = new C();
Console.WriteLine(x.Name());
Console.WriteLine(y.Name());
Console.WriteLine(((A)y).Name());

class A { public virtual string Name() => "A"; }
class B : A { public override string Name() => "B"; }
class C : B { public new string Name() => "C"; }

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: B, B, B. C.Name объявлен через new, он не переопределяет виртуальный метод, а скрывает его.

Что выведет

B
B
B

Разбор

C.Name объявлен через new, он не переопределяет виртуальный метод, а скрывает его. Для виртуального вызова последнее переопределение Name это B.Name. Через ссылку A и через ссылку B вызов идёт по таблице виртуальных методов и попадает в B. C напечатался бы только через ссылку типа C.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме