Как сокрытие метода F влияет на вызовы через базовый тип?

Вывод: C.F, B.F, C.F. Метод не виртуальный, поэтому при сокрытии через new выбор зависит от статического типа выражения; объект при этом остаётся одним экземпляром C.

Короткий ответ

Что ответить на собеседовании

Вывод: C.F, B.F, C.F. Метод не виртуальный, поэтому при сокрытии через new выбор зависит от статического типа выражения; объект при этом остаётся одним экземпляром C.

Подробный разбор

Ответ с пояснениями

Условие

Определите вывод C#:

using System;
class B { public void F() => Console.WriteLine("B.F"); }
class C : B {
    public new void F() => Console.WriteLine("C.F");
    public static void PrintStuff() {
        C c = new C();
        B b = c;
        c.F(); b.F(); ((C)b).F();
    }
}
class Program { static void Main() => C.PrintStuff(); }

Ответ

Вывод: C.F, B.F, C.F. Метод не виртуальный, поэтому при сокрытии через new выбор зависит от статического типа выражения; объект при этом остаётся одним экземпляром C.

Вызов через c выбирает C.F, через b — B.F, а приведение возвращает выражению тип C. Ключевое слово new делает сокрытие явным и убирает предупреждение; оно не включает полиморфную диспетчеризацию. Для поведения по фактическому типу объекта B.F должен быть virtual, а C.F — override: тогда все три вызова выбрали бы переопределение C.

Источник: learn.microsoft.com.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее