2011-07-04 10 views

Respuesta

65

La siguiente página resume muy bien su pregunta.

Knowing When to Use Override and New Keywords

Resumen

Override: Cuando un método de una clase base se reemplaza en una clase derivada, se utiliza la versión en la clase derivada, incluso si el código de llamada didn' t "saber" que el objeto era una instancia de la clase derivada.

Nuevo: Si usa la palabra clave new en lugar de anular, 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 recibirá una advertencia del compilador (ya que puede no ser consciente de que está ocultando un método en el método de la clase base, o de hecho es posible que haya querido anularlo, y simplemente se olvidó de incluir la palabra clave).

Anulación: se utiliza con el tipo virtual/Abstract/anulación del método en la clase base

Nueva: cuando la clase base no ha declarado método virtual/Abstract/anular

+9

¿Se puede incluir la información relevante aquí también por favor. Ayuda a mantener la información aquí y protege contra la podredumbre del enlace (poco probable con un blog de MSDN, pero nunca se sabe). – ChrisF

+0

Gracias por los consejos, edité mi respuesta. –

+3

lol "poco probable" Recibo un redireccionamiento seguido de "Acceso denegado No tiene permiso para ver/descargar este elemento". – tobsen

1

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

+0

esto tanto lo sabía, sin embargo, la omisión ocultará eficazmente un método de clases base – jaywayco

+2

Ninguna anulación no oculta el método de la clase base. La anulación hace llamadas al método de clase base en llamadas al método de clase derivado. De una manera con la anulación, el método en la clase derivada es el mismo método que el de la clase base. Mientras que con 'new' es un método completamente independiente que simplemente tiene el mismo nombre. – CodesInChaos

+0

@CodeInChaos Gracias por decir lo que quería decir mejor de lo que pude decir :) –

56

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 polimorfismo 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 hace 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 

Ya que se puede definir nuevas firmas de los métodos con new, es imposible que el compilador sabe que la instancia de A es en realidad una instancia de B y el nuevo método B define debería estar disponible. new se puede usar cuando el método, la propiedad, el campo o el evento del objeto primario no se declara con virtual, y debido a la falta de virtual, el compilador no "buscará" el método heredado. Con virtual y override, sin embargo, funciona.

Recomiendo encarecidamente que evite 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.

+7

Esta debería ser la respuesta aceptada. En realidad, explica, con ejemplos, cuáles son las diferencias y las implicaciones. La respuesta aceptada es bastante vaga. – theyetiman

7

se parece a una vieja pregunta, vamos a tratar una respuesta diferente:

  1. new: como su nombre lo dice, es un nuevo miembro en la familia de jerarquía de herencia y esto va a ser utilizado como elemento de 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 primaria y lo haré de manera diferente.

1

Consideremos el 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"); 
     } 
    } 
}  

salida de códigos anteriores debe ser:

Overrider => Foo 
Overrider => Foo 

Hider  => Foo 
Base  => Foo 
  • Una subclase overrides un método virtual mediante la aplicación de la override modifier:
  • Si desea hide un miembro deliberadamente, en cuyo 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
Cuestiones relacionadas