Middle
Qual é a diferença entre sobrescrever e ocultar métodos em C#?
sobes.tech IA
Resposta da IA
A redefinição (override) é usada para implementar o polimorfismo, permitindo que a classe derivada forneça sua própria implementação de um método virtual, abstrato ou herdado. A palavra-chave virtual na classe base e override na derivada são obrigatórias.
O ocultamento (hiding, shadowing) é feito por um método com o mesmo nome na classe derivada que oculta o método da classe base. O método da classe base é mantido, mas o acesso a ele a partir de uma instância da derivada é feito por uma conversão explícita de tipo ou pela palavra-chave base. Usa-se a palavra-chave new na derivada.
| Característica | Redefinição (Override) | Ocultamento (Hiding) |
|---|---|---|
| Palavra-chave | virtual (base), override (derivada) |
new (derivada) |
| Polimorfismo | Sim, chama a implementação da derivada | Não, chama a implementação dependendo do tipo de referência |
| Chamada por referência de tipo base | Chama o método sobrescrito da derivada | Chama o método da classe base |
| Acesso ao método da classe base | Via base.MethodName() |
Via base.MethodName() ou conversão de tipo |
public class BaseClass
{
public virtual void ShowMessage() // Método virtual para redefinir
{
Console.WriteLine("Mensagem de BaseClass (virtual).");
}
public void DisplayInfo() // Método para ocultar
{
Console.WriteLine("Info de BaseClass.");
}
}
public class DerivedClass : BaseClass
{
public override void ShowMessage() // Redefinição do método virtual
{
Console.WriteLine("Mensagem de DerivedClass (override).");
}
public new void DisplayInfo() // Ocultamento do método
{
Console.WriteLine("Info de DerivedClass (new).");
}
}
public class Program
{
public static void Main(string[] args)
{
BaseClass baseObj = new BaseClass();
DerivedClass derivedObj = new DerivedClass();
BaseClass derivedAsBase = new DerivedClass(); // Referência de tipo base para um objeto derivado
baseObj.ShowMessage(); // Saída: Mensagem de BaseClass (virtual).
baseObj.DisplayInfo(); // Saída: Info de BaseClass.
derivedObj.ShowMessage(); // Saída: Mensagem de DerivedClass (override).
derivedObj.DisplayInfo(); // Saída: Info de DerivedClass (new).
derivedAsBase.ShowMessage(); // Saída: Mensagem de DerivedClass (override). (Polimorfismo em ação)
derivedAsBase.DisplayInfo(); // Saída: Info de BaseClass. (Método de BaseClass chamado devido ao tipo de referência)
}
}