Подводя итог вашему вопросу: у вас есть базовый класс и производный класс. Производный класс переопределяет виртуальный метод базового класса. При наличии экземпляра производного класса можно ли принудительно вызвать версию метода базового класса вместо производного класса?
Краткий ответ: Да, внутри класса. Снаружи класса, нет.
По сути, здесь вы хотите сделать не виртуальный вызов виртуального метода . Разрешается делать не виртуальный вызов метода базового класса, но только внутри класса :
class B
{
public virtual void M() { Console.WriteLine("B.M"); }
}
class D : B
{
public override void M() { Console.WriteLine("D.M"); }
public void BM() { base.M(); }
}
...
D d = new D();
d.M(); // D.M
d.BM(); // B.M
Теперь для продвинутых игроков это хитрые способы вызова B.M
с экземпляром D
в качестве получателя, и я не собираюсь рассказывать вам, кто они. Вы не должны пытаться сделать это. CLR может помечать такие попытки как нарушения своих правил «проверенного кода». Правила виртуального переопределения существуют для вашего удобства и безопасности. Не пытайтесь выполнить эти правила в конце концов.