Sobes.tech
Middle

¿Cuál es la diferencia entre sobrescribir y ocultar métodos en C#?

sobes.tech AI

Respuesta de la IA

La sobrescritura (override) se utiliza para implementar el polimorfismo, permitiendo que la clase derivada proporcione su propia implementación de un método virtual, abstracto o heredado. La palabra clave virtual en la clase base y override en la heredada son obligatorias.

El ocultamiento (hiding, shadowing) se realiza mediante un método con el mismo nombre en la clase derivada que oculta el método de la clase base. El método de la clase base se mantiene, pero el acceso a él desde una instancia de la heredada se realiza mediante una conversión explícita de tipo o la palabra clave base. Se usa la palabra clave new en la heredada.

Característica Sobrescritura (Override) Ocultamiento (Hiding)
Palabra clave virtual (base), override (heredada) new (heredada)
Polimorfismo Sí, se llama a la implementación de la heredada No, se llama a la implementación según el tipo de referencia
Llamada por referencia de tipo base Se llama al método sobrescrito de la heredada Se llama al método de la clase base
Acceso al método de la clase base A través de base.MethodName() A través de base.MethodName() o conversión de tipo
public class BaseClass
{
    public virtual void ShowMessage() // Método virtual para sobrescribir
    {
        Console.WriteLine("Mensaje de BaseClass (virtual).");
    }

    public void DisplayInfo() // Método para ocultar
    {
        Console.WriteLine("Información de BaseClass.");
    }
}

public class DerivedClass : BaseClass
{
    public override void ShowMessage() // Sobrescritura del método virtual
    {
        Console.WriteLine("Mensaje de DerivedClass (override).");
    }

    public new void DisplayInfo() // Ocultamiento del método
    {
        Console.WriteLine("Información de DerivedClass (new).");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        BaseClass baseObj = new BaseClass();
        DerivedClass derivedObj = new DerivedClass();
        BaseClass derivedAsBase = new DerivedClass(); // Referencia de tipo base a un objeto heredado

        baseObj.ShowMessage();     // Salida: Mensaje de BaseClass (virtual).
        baseObj.DisplayInfo();     // Salida: Información de BaseClass.

        derivedObj.ShowMessage();  // Salida: Mensaje de DerivedClass (override).
        derivedObj.DisplayInfo();  // Salida: Información de DerivedClass (new).

        derivedAsBase.ShowMessage(); // Salida: Mensaje de DerivedClass (override). (Polimorfismo en acción)
        derivedAsBase.DisplayInfo(); // Salida: Información de BaseClass. (El método de BaseClass se llama por el tipo de referencia)
    }
}