¿Cuál es la diferencia entre las palabras clave override
y new
en C# cuando se definen métodos en jerarquías de clase?¿Cuál es la diferencia entre la anulación y las nuevas palabras clave en C#?
Respuesta
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
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.
esto tanto lo sabía, sin embargo, la omisión ocultará eficazmente un método de clases base – jaywayco
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
@CodeInChaos Gracias por decir lo que quería decir mejor de lo que pude decir :) –
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.
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
se parece a una vieja pregunta, vamos a tratar una respuesta diferente:
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).override
: Significa que no acepto la implementación de miembros de mi clase primaria y lo haré de manera diferente.
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 laoverride modifier
:- Si desea
hide
un miembro deliberadamente, en cuyo caso puede aplicar elnew modifier
al miembro en la subclase.The new modifier does nothing more than suppress the compiler warning that would otherwise result
- 1. ¿Cuál es la diferencia entre "palabra clave" y "palabra reservada"?
- 2. Cuál es la diferencia entre las palabras clave de Sunspot y el texto completo
- 3. ¿Cuál es la diferencia entre las palabras clave `fun` y` function`?
- 4. ¿Diferencia entre sombreado y anulación en C#?
- 5. Cuál es la diferencia entre los implementos y extiende palabras clave en Java
- 6. ¿Cuál es la diferencia entre los argumentos con valores predeterminados y argumentos de palabras clave?
- 7. ¿Cuál es la diferencia entre el encasillamiento normal y el uso de “palabras clave como”
- 8. ¿Cuál es la diferencia entre cheque y clave externa?
- 9. ¿Cuál es la diferencia entre dynamic (C# 4) y var?
- 10. ¿Cuál es la diferencia entre C y C incrustado?
- 11. Cuál es la diferencia entre memset y memcpy en C
- 12. ¿Cuál es la diferencia entre union y join?
- 13. C++ STL :: ¿cuál es la diferencia entre inplace_merge y sort
- 14. ¿Cuál es la diferencia entre la clave candidata y la clave compuesta?
- 15. ¿Cuál es la diferencia entre la sobrecarga de método y la anulación?
- 16. ¿Cuál es la diferencia entre Visual C++ y C++?
- 17. ¿Cuál es la diferencia entre C++ administrado y C#?
- 18. ¿Cuál es la diferencia entre Managed C++ y C++/CLI?
- 19. ¿Cuál es la diferencia entre 'int'? y 'int' en C#?
- 20. En C# ¿cuál es la diferencia entre ToUpper() y ToUpperInvariant()?
- 21. ¿Cuál es la diferencia entre File y FileInfo en C#?
- 22. ¿Cuál es la diferencia entre Process y ProcessStartInfo en C#?
- 23. ¿Cuál es la diferencia entre printf() y puts() en C?
- 24. ¿cuál es la diferencia entre atan y atan2 en C++?
- 25. ¿Cuál es la diferencia entre System.Type y System.RuntimeType en C#?
- 26. ¿Cuál es la diferencia entre strtok_r y strtok_s en C?
- 27. ¿Cuál es la diferencia entre Const y Static en C#?
- 28. Cuál es la diferencia entre & y operadores & en C#
- 29. Cuál es la diferencia entre $ (...) y `...`
- 30. ¿Cuál es la diferencia entre la clave externa y la clave de referencia?
¿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
Gracias por los consejos, edité mi respuesta. –
lol "poco probable" Recibo un redireccionamiento seguido de "Acceso denegado No tiene permiso para ver/descargar este elemento". – tobsen