¿Cuál es la diferencia entre la anulación y las nuevas palabras clave en C #?

¿Cuál es la diferencia entre la override y las new palabras clave en C # cuando se definen los métodos en las jerarquías de clase?

La siguiente página resume tu pregunta muy bien.

Saber cuándo usar Anular y nuevas palabras clave

Resumen

Anular : cuando se anula un método de una clase base en una clase derivada, se utiliza la versión en la clase derivada, incluso si el código de llamada no “sabía” que el objeto era una instancia de la clase derivada.

Nuevo : si usa la nueva palabra clave en lugar de sobrescribir, el método en la clase derivada no anula el método en la clase base, simplemente lo oculta.

Si no especifica ni nuevas ni anulaciones, el resultado resultante es el mismo que si especificara nuevo, pero también obtendrá una advertencia del comstackdor (ya que puede no ser consciente de que está ocultando un método en la clase base método, o de hecho puede haber querido anularlo, y simplemente se olvidó de incluir la palabra clave).

Anular : se usa con el método de método virtual / abstracto / anular en la clase base

Nuevo : cuando la clase base no ha declarado el método como virtual / abstracto / anulación

new sombreará el método con un método completamente nuevo (que puede o no tener la misma firma) en lugar de anularlo (en cuyo caso, el nuevo método debe tener la misma firma), lo que significa que el polymorphism no funcionará. Por ejemplo, tienes estas clases:

 class A { public virtual int Hello() { return 1; } } class B : A { new public int Hello(object newParam) { return 2; } } class C : A { public override int Hello() { return 3; } } 

Si haces esto:

 A objectA; B objectB = new B(); C objectC = new C(); Console.WriteLine(objectB.Hello(null)); // 2 Console.WriteLine(objectC.Hello()); // 3 objectA = objectB; Console.WriteLine(objectA.Hello()); // 1 objectA = objectC; Console.WriteLine(objectA.Hello()); // 3 

Como puede definir nuevas firmas de método con new , es imposible para el comstackdor saber que la instancia de A es en realidad una instancia de B y el nuevo método B define que debería estar disponible. new se puede usar cuando el método, propiedad, campo o evento del objeto principal no se declara con virtual , y debido a la falta de virtual el comstackdor no “buscará” el método heredado. Con virtual y override , sin embargo, funciona.

Recomiendo encarecidamente que evite los new ; en el mejor de los casos, es confuso, porque está definiendo un método con un nombre que podría reconocerse como otra cosa, y en el peor, puede ocultar errores, introducir errores aparentemente imposibles y dificultar la ampliación de la funcionalidad.

Parece una vieja pregunta, déjame probar una respuesta diferente:

  1. new : como su nombre lo indica, es un nuevo miembro en la jerarquía de la familia de herencia y se usará como miembro base para más abajo en la cadena (si está marcado como virtual).

  2. override : significa que no acepto la implementación de miembros de mi clase de padres y lo haré de manera diferente.

Considere la siguiente jerarquía de clases:

 using System; namespace ConsoleApp { public static class Program { public static void Main(string[] args) { Overrider overrider = new Overrider(); Base base1 = overrider; overrider.Foo(); base1.Foo(); Hider hider = new Hider(); Base base2 = hider; hider.Foo(); base2.Foo(); } } public class Base { public virtual void Foo() { Console.WriteLine("Base => Foo"); } } public class Overrider : Base { public override void Foo() { Console.WriteLine("Overrider => Foo"); } } public class Hider : Base { public new void Foo() { Console.WriteLine("Hider => Foo"); } } } 

La salida de los códigos anteriores debe ser:

 Overrider => Foo Overrider => Foo Hider => Foo Base => Foo 
  • Una subclase overrides un método virtual al aplicar el override modifier :
  • Si desea hide un miembro deliberadamente, en ese caso puede aplicar el new modifier al miembro en la subclase. The new modifier does nothing more than suppress the compiler warning that would otherwise result

override permite anular un método virtual en una clase base para que pueda poner una implementación diferente. new ocultará un método no virtual en una clase base.