Резюме для программиста
Люди годами делают сотни миллионов денег, принимая на работу по таким задачкам, люкам и шарикам в автобусах, а вы им солидами всякими тыкать будете? Солиды и прочие лисковы - для лохов, которые не могут залить баблом свою дурь. )))
Да ладно, просто напишите результат вывода хотя бы по этому, без подгляда и запуска:
A aaa = new D();
aaa.Method1();
aaa.Method2();
B b = new D();
b.Method1();
b.Method2();
Я вот, следуя своей логике, что выше написал, всё правильно решил. А читая МСДНы и прочие описания - нихрена понять не мог, почему у меня не так, как в реальности выводится.
Правда, боюсь, что толку от этого не много, т.к. скоро забуду. А потом полезу опять читать в какой-нибудь МСДН, и снова будет каша в голове с их пояснений. Наверняка все эти условия с new и override внутри Дотнета какой-нибудь пачкой if'ов описываются при разборе иерархии наследования, какую версию какого метода вызвать. А они, вместо того, чтобы просто логическую таблицу с этими if'ами привести, начинают дуть в уши про "тут скрываем, тут перезаписываем", безотносительно того, где и что имеется ввиду.