Jak wszyscy inni mówią, B.Method2 zostaje wywołany. Oto kilka innych informacji, aby zrozumieć, co się dzieje:
((A)B).Method2();
B.Method2();
Będą zarówno zadzwonić B.Method1(), ponieważ został prawidłowo nadpisane. Aby wywołać metodę A's1, musi być wywołanie base.Method1() z B (co często, ale nie zawsze jest wykonywane w implementacji metody B. Metod1).
Jeśli jednak B została określona w następujący sposób:
class B:A {
new public void Method1() { }
... potem za Method1() będzie nazywany ponieważ Method1 nie został faktycznie przesłonięte było ukrytych i schowany poza regułami polimorfizmu. Ogólnie rzecz biorąc, zazwyczaj jest to złe. Nie zawsze, ale upewnij się, że dobrze wiesz, co robisz i dlaczego to robisz, jeśli kiedykolwiek zrobisz coś takiego.
Po drugiej stronie, używając nowy w ten sposób tworzy również interesujące pytania dotyczące wywiadu.
Dlaczego po prostu tego nie wypróbujesz? –
@Jeff: Nie ma znaczenia; B.Method1() jest nadal funkcją, która jest wywoływana. – apandit
Myślę, że zgodnie z VMT (Tabela metod Vitual) zostanie wywołana najnowsza wersja zastąpionej metody. , więc może to być B.Method1() – TalentTuner