Olá, Carlos Roberto
Reescrevi seu código conforme abaixo, para ficar mais simples de demonstrar:
class ClasseBase
{
public void Funcao1()
{
Console.WriteLine("ClasseBase.Funcao1");
}
public virtual void Funcao2()
{
Console.WriteLine("ClasseBase.Funcao2");
}
}
class ClasseFilha : ClasseBase
{
public new void Funcao1()
{
Console.WriteLine("ClasseFilha.Funcao1");
}
public override void Funcao2()
{
Console.WriteLine("ClasseFilha.Funcao2");
}
}
Vamos declarar uma variável como ClasseBase e inicializá-la com uma instância de ClasseBase. Em seguida, chamamos Funcao1() e Funcao2():
ClasseBase obj1 = new ClasseBase();
obj1.Funcao1();
obj1.Funcao2();
Como resultado do console, somente os métodos da classe base são invocados:
Console:
=======
ClasseBase.Funcao1
ClasseBase.Funcao2
Até aí, nenhuma novidade. Agora vamos criar uma nova variável como ClasseFilha e inicializá-la com uma instância de ClasseFilha. Em seguida, chamamos Funcao1() e Funcao2():
ClasseFilha obj2 = new ClasseFilha();
obj2.Funcao1();
obj2.Funcao2();
Como resultado do console, somente os métodos da classe filha são invocados:
Console:
=======
ClasseFilha.Funcao1
ClasseFilha.Funcao2
Aqui também, nada de mais. Agora vamos criar uma nova variável como ClasseBase e inicializá-la com uma instância de ClasseFilha. Em seguida, chamamos Funcao1() e Funcao2():
ClasseBase obj3 = new ClasseFilha();
obj3.Funcao1();
obj3.Funcao2();
Quando executamos, aparece no console:
Console:
=======
ClasseBase.Funcao1
ClasseFilha.Funcao2
O que aconteceu? Por que chamou Funcao1 da classe base e Funcao2 da classe filha?
Em primeiro lugar, como obj3 foi declarado como ClasseBase, o runtime do .NET vai procurar os métodos na ClasseBase:
- O modificador
virtual no método ClasseBase.Funcao2() diz para o runtime procurar alguma possível substituição desse método na hierarquia de herança de classes. E ele encontra o mesmo método na classe derivada, ClasseFilha.Funcao2(), e por isso este é executado. - O método
ClasseFilha.Funcao1 no seu código não possui modificador virtual. Logo, implicitamente, ele utiliza o modificador new. O modificador new no método ClasseFilha.Funcao1() diz para o runtime que esse método na classe filha é "novo", ou seja, ele não substitui ClasseBase.Funcao1(). Por isso, ClasseFilha.Funcao1() não é executado.