Программа напечатает BAC без разделителей. Print1 переопределён в B, Print2 у A невиртуальный, а C лишь скрывает его новым методом.
public class A
Программа напечатает BAC без разделителей. Print1 переопределён в B, Print2 у A невиртуальный, а C лишь скрывает его новым методом.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
public class A { public virtual void Print1() { System.Console.Write("A"); } public void Print2() { System.Console.Write("A"); } }
public class B : A { public override void Print1() { System.Console.Write("B"); } }
public class C : B { public new void Print2() { System.Console.Write("C"); } }
static void Main(string[] args) { var c = new C(); A a = c;
a.Print1();
a.Print2();
c.Print2();
}
Что будет в stdout?
Ответ
Программа напечатает BAC без разделителей. Print1 переопределён в B, Print2 у A невиртуальный, а C лишь скрывает его новым методом.
a фактически ссылается на C. Вызов a.Print1() проходит виртуальную диспетчеризацию и использует унаследованную от B реализацию, печатающую B.
Для a.Print2() используется статический тип A, поэтому выводится A. В c.Print2() статический тип C, где объявлен скрывающий метод, и выводится C. Ключевое слово new не превращает невиртуальный метод базы в override.