Mientras realizaba una refactorización, terminé creando un método como el siguiente ejemplo. El tipo de datos se ha cambiado por simplicidad.
Anteriormente tenía una declaración de asignación como esta:
MyObject myVar = new MyObject();
Fue refactorizado a esto por accidente:
private static new MyObject CreateSomething()
{
return new MyObject{"Something New"};
}
Esto fue el resultado de un error de cortar / pegar de mi parte, pero la new
palabra clave in private static new
es válida y se compila.
Pregunta : ¿Qué significa la new
palabra clave en la firma de un método? ¿Supongo que es algo introducido en C # 3.0?
¿En qué se diferencia esto de override
?
new
como un modificador en un método (u otro miembro de tipo) no es "algo introducido en C # 3.0". Ha estado ahí desde la primera versión de C #.Respuestas:
Nueva referencia de palabras clave de MSDN:
Referencia de MSDN
Aquí hay un ejemplo que encontré en la red de un MVP de Microsoft que tenía sentido: Enlace al original
La anulación solo se puede utilizar en casos muy específicos. Desde MSDN:
Por lo tanto, la palabra clave 'nueva' es necesaria para permitirle 'anular' métodos no virtuales y estáticos.
fuente
new
se trata, pero creo que literalmente solo está ahí para facilitar la lectura: el compilador simplemente le advierte que cuando llama al método de clase derivada del mismo nombre que base, no obtendrá el método de la clase base que puede creo que ... es extraño ... ¿simplemente por legibilidad?IMyInterface
, se llamará a la implementación en la clase Derived. AsíIMyInterface c = new B()
llamará a la implementación de la clase B. Si solo una clase implementa la interfaz, se llamará al método de la clase que la implementa.No, en realidad no es "nuevo" (perdón por el juego de palabras). Básicamente se utiliza para "ocultar" un método. ES DECIR:
Si luego haces esto:
El método en la Base es el que se llamará, NO el del derivado.
Más información: http://www.akadia.com/services/dotnet_polymorphism.html
Re su edición: En el ejemplo que le di, si tuviera que "anular" en lugar de usar "nuevo", cuando llame a b.Method (); El método de la clase derivada se llamaría debido a polimorfismo.
fuente
Como explicaron otros, se usa para ocultar un método existente. Es útil para anular un método que no es virtual en la clase principal.
Tenga en cuenta que crear un miembro "nuevo" no es polimórfico. Si lanza el objeto al tipo base, no usará el miembro del tipo derivado.
Si tienes una clase base:
Y luego la clase derivada:
Si declaras un tipo de
DerivedType
y luego lo lanzas, el métodoDoSomething()
no es polimórfico, llamará al método de la clase base, no al derivado.fuente
override
firma de métodonew
oculte el tipo base del tipo derivado, porque ¿no siempre se puede acceder al tipo base usando labase.<type>
notación?base.<method>
, y también se puede llamar externamente si lanza al tipo base en su código. Es técnicamente más exacto pensar en él como "anular" el método base que "ocultarlo".De los documentos:
Si el método de la clase derivada está precedido por la nueva palabra clave, el método se define como independiente del método de la clase base.
Lo que esto significa en la práctica:
Si hereda de otra clase y tiene un método que comparte la misma firma, puede definirlo como 'nuevo' para que sea independiente de la clase principal. Esto significa que si tiene una referencia a la clase 'principal', esa implementación se ejecutará, si tiene una referencia a la clase secundaria, esa implementación se ejecutará.
Personalmente, trato de evitar la palabra clave "nueva", ya que normalmente significa que tengo una jerarquía de clases incorrecta, pero hay ocasiones en las que puede ser útil. Un lugar es para el control de versiones y la compatibilidad con versiones anteriores.
Hay mucha información en MSDN para esto .
fuente
new
estar allí. Es sintáctico / legible.Significa que el método reemplaza un método por el mismo nombre heredado por la clase base. En su caso, probablemente no tenga un método con ese nombre en la clase base, lo que significa que la nueva palabra clave es totalmente superflua.
fuente
En pocas palabras: NO es obligatorio, NO cambia NINGÚN comportamiento, y está PURAMENTE ahí para facilitar la lectura.
Es por eso que en VS verá un poco ondulado, pero su código se compilará y se ejecutará perfectamente bien y como se esperaba.
Uno tiene que preguntarse si realmente valió la pena crear la
new
palabra clave cuando todo lo que significa es que el desarrollador reconoce "Sí, sé que estoy ocultando un método base, sí, sé que no estoy haciendo nada relacionado convirtual
ooverriden
(polimorfismo) - Realmente quiero crear su propio método ".Es un poco extraño para mí, pero tal vez solo porque vengo de un
Java
entorno y existe esta diferencia fundamental entreC#
herencia yJava
: EnJava
, los métodos son virtuales de forma predeterminada a menos que lo especifiquefinal
. EnC#
, los métodos son finales / concretos por defecto a menos que lo especifiquevirtual
.fuente
Desde MSDN :
fuente
Tenga cuidado con este problema.
Tiene un método definido en una interfaz que se implementa en una clase base. Luego, crea una clase derivada que oculta el método de la interfaz, pero no declara específicamente que la clase derivada implementa la interfaz. Si luego llama al método a través de una referencia a la interfaz, se llamará al método de la clase base. Sin embargo, si su clase derivada implementa específicamente la interfaz, entonces su método se llamará independientemente del tipo de referencia que se use.
fuente