Недавно я получил следующий фрагмент кода как своего рода головоломку, чтобы помочь понять Polymorphism и Inheritance в OOP - С#.
// No compiling!
public class A
{
     public virtual string GetName()
     {
          return "A";
     }
 }
 public class B:A
 {
     public override string GetName()
     {
         return "B";
     }
 }
 public class C:B
 {
     public new string GetName()
     {
         return "C";
     }
 }
 void Main()
 {
     A instance = new C();
     Console.WriteLine(instance.GetName());
 }
 // No compiling!
Теперь, после долгой, продолжительной беседы с другим разработчиком, который представил загадку, я знаю, какой результат, но я не испорчу его для вас. Единственная проблема, с которой я действительно сталкиваюсь, - это то, как мы получаем этот вывод, как код проходит, что наследует что и т.д.
Я думал, что C будет возвращен, поскольку это, кажется, класс, который определен. Затем я просмотрел вопрос о том, будет ли возвращен B, потому что C наследует B - но B также наследует A (где я запутался!).
Вопрос:
Может ли кто-нибудь объяснить, как полиморфизм и наследование играют свою роль в извлечении вывода, в конечном счете отображаемом на экране?