Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода

В базовом классе метод помечен как virtual.

Насколько я понял из книги:

override означает, что метод не утрачивает связи с базовым классом.

New означает полное переопределение метода.

Таким образом, в моем понимании, возможны три варианта:

1. Вызов метода базового класса путем обращения с экземпляром дочернего класса как с экземпляром родительского класса (например, при помещении в массив экземпляров родительского класса).

2. Вызов переопределенного метода (overridden).

3. Вызов нового метода (new).

И надеялся в своем примере получить:

Overridden имя кошки: Murka.

В базовом классе: Baikal

New имя собаки:Baikal

Т.е. в цикле foreach должен у собаки вызваться метод из базового класса (потому что я в этом цикле прогоняю экземпляры класса Animal). А вот когда я конкретно вызываю метод получения имени для класса Dog, то должен сработать новый метод.

Почему в своем примере я получаю результат

Overridden имя кошки: Murka.

В базовом классе: Baikal

В базовом классе: Baikal

?

Заранее спасибо.

C#Выделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

using System;
class Animal
{
    public Animal(string name)
    {
        this.name = name;
    }
 
    public virtual string getName()
    {
        return "В базовом классе " + name;    
    }                            
 
    private string name;
 
}
 
class Cat : Animal
{
    public Cat(string name) : base(name){}
    public override string getName()
    {
        return "Overridden имя кошки: " + base.getName();
    }
}
 
class Dog : Animal
{
    public Dog(string name) : base(name){}
 
    new string getName()
    {
        return "New имя собаки: " + base.getName();
    }
 
}
 
 
class AnimalTest
{
    public static void Main()
    {
        Animal[] farm = new Animal[2];
      farm[0] = new Cat("Murka");
        farm[1] = new Dog("Baikal");
 
 
        foreach(Animal animal in farm)
        {
            Console.WriteLine(animal.getName());
        }
 
        Console.WriteLine(farm[1].getName());
 
    }
}