Sobes.tech
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)
    }
}