2008-12-04 11 views

Respuesta

12

"nuevo" significa que tiene dos métodos completamente diferentes en lo que respecta al CLR: tienen el mismo nombre, pero no están relacionados en términos de herencia. Eso significa que si ejecuta:

Base b = new Derived(); 
Derived d = new Derived(); 
b.MyMethod(); // Calls Base.MyMethod 
d.MyMethod(); // Calls Derived.MyMethod 

Esto puede generar un código muy difícil de comprender.

Por lo general, si desea diferentes métodos, llámelos diferentes cosas. La razón normal para usar el mismo nombre (y firma) es anular el comportamiento del método de una clase base. En ese momento, no tiene otra opción que mantener el nombre/firma igual.

3

Todavía estoy tratando de averiguar qué es el caso de uso para "nuevo" aparte de horrible hacking.

+0

There * IS * no usecase, es * otro * método que pasa a tener el "mismo nombre", punto ... –

+3

El caso de uso es bastante simple, en realidad. Los pasos son: 1) deriva de una clase que no está bajo su control (por ejemplo, una del marco). 2) Presenta un nuevo método llamado Foo(). 3) Una versión posterior de la clase base también presenta a Foo(). 4) Obtienes una advertencia de compilación y la arreglas. –

+3

Las opciones para solucionarlo son: a) Cambiar el nombre del método (no siempre es factible). b) Agregue el modificador "nuevo". Y sí, esta es una situación desagradable que debes evitar siempre que sea posible, pero es agradable que C# al menos te permita sobrellevarlo. –

0

Esto es en realidad no a elección usted tiene. Esto se te impone por la creación de la clase base. Si existe un método con el mismo nombre y está marcado como "virtual", debe utilizar la anulación a menos que desee tener algunos errores graciosamente divertidos que aparezcan en el futuro cuando las personas comiencen a enviar objetos de su clase a la clase base ...

Aunque si ese método NO está marcado como "virtual", entonces la única forma de crear un NUEVO método es mediante el uso de la palabra clave "nueva". Sin embargo, tenga en cuenta que esto no reemplazará las invocaciones de métodos donde la referencia es de typeof (clase base) para su método. Así que esto es principalmente azúcar sintáctica para crear un nuevo método con el mismo nombre y la misma firma ...

Aunque cuando el código golpea tu plancha no es otra cosa que un método completamente diferente con el mismo nombre y la misma firma. Cuando un método reemplazado será reemplazar cada sola llamada incluidos los de la clase base de montaje a su nuevo método de ...

Así compararlos es como comparar coches y errh ... pájaros o algo ..

Cuestiones relacionadas