Cuando trabajamos con herencia en C#, dos palabras clave aparecen para definir comportamiento en clases derivadas: new y override. A primera vista pueden parecer similares, pero representan intenciones diferentes. Entenderlas bien puede evitarte muchos errores.
En C# una clase puede heredar miembros (métodos, propiedades, etc.) de otra. ¿Pero qué pasa si queremos cambiar el comportamiento de un método heredado?
Ahí entran en juego override y new.
Cuando queremos modificar el comportamiento de un método heredado, usámos override.
class Animal
{
public virtual void Hablar()
{
Console.WriteLine("Hace un sonido");
}
}
class Perro : Animal
{
public override void Hablar()
{
Console.WriteLine("Guau");
}
}
Y ahora mirá esto:
Animal a = new Perro();
a.Hablar(); // Imprime "Guau"
Con override, el comportamiento depende del tipo real del objeto, no del tipo de la variable. Esto se llama polimorfismo.
En cambio, new oculta el método de la clase base. No lo reemplaza a nivel del sistema de tipos.
class Animal
{
public void Hablar()
{
Console.WriteLine("Hace un sonido");
}
}
class Gato : Animal
{
public new void Hablar()
{
Console.WriteLine("Miau");
}
}
Probá esto:
Animal a = new Gato();
a.Hablar(); // Imprime "Hace un sonido"
Porque a es del tipo Animal, y el método Hablar() de Gato no lo reemplazó: solo lo ocultó. Pero:
Gato g = new Gato();
g.Hablar(); // Imprime "Miau"
¿cuándo uso new?
- Cuando querés ocultar intencionalmente un método de la clase base, pero sin reemplazarlo para el sistema de tipos.
- Generalmente se evita, porque puede causar confusión. Se usa cuando no podés cambiar la clase base (por ejemplo, una librería externa) pero necesitás un método con el mismo nombre y diferente comportamiento.
¿Qué pasa si no usás ni new ni override? El compilador mostrará una advertencia si detecta que estás ocultando un miembro sin decirlo explícitamente.
// Esto compila, pero da warning:
public void Hablar() { ... } // Oculta un método de la base
Siempre que ocultes un miembro heredado, C# quiere que lo declares con new o override, para que tu intención sea clara.