2012-03-06 5 views
13

Duplicar posibles:
C# keyword usage virtual+override vs. new
Difference between new and override?Cuando usar nueva en lugar de anulación C#

Así que he estado trabajando en un proyecto y decidió leer un poco acerca de la diferencia entre las new y override palabras clave en C#.

Por lo que vi, parece que el uso de la funcionalidad de palabras clave new es una gran manera de crear errores en el código. Aparte de eso, realmente no veo cuándo tendría sentido usarlo.

Más por curiosidad que otra cosa, ¿hay algún patrón en el que la palabra clave new es el camino correcto a seguir?

+0

http://msdn.microsoft.com/en-us/library/ms173153(v=vs.80).aspx –

+1

Puede notar que no estaba preguntando cuál es la diferencia entre las dos palabras clave.La pregunta era si existía o no un patrón común en el que intencionalmente quisieran ocultar a los miembros de la clase base de esta manera. – user472875

+3

@Ramhound: tiene sentido si dejas de pensar tan literalmente. El uso incorrecto de la palabra clave nueva al heredar de una clase principal puede provocar muchos errores cuando se utiliza de forma incorrecta (los desarrolladores a menudo la aplican a un método que pretenden anular pero que no es virtual ... lo que conduce a un comportamiento muy inesperado). –

Respuesta

7

La palabra clave new es el camino correcto cuando desea ocultar una implementación base y no le importa que no pueda llamar a su método al tratar su objeto polimórficamente.

Aclaro. Considere lo siguiente:

public class Base 
{ 
    public void DoSomething() 
    { 
     Console.WriteLine("Base"); 
    } 
} 

public class Child : Base 
{ 
    public void new DoSomething() 
    { 
     Console.WriteLine("Child"); 
    } 
} 

De vez en cuando, es beneficioso para ocultar la funcionalidad de la clase base en el niño por lo tanto, el uso de la palabra clave new. El problema es que algunos desarrolladores hacen ciegamente lo que llevará al efecto lateral siguientes (de ahí los 'bichos' que mencionas):

Base instance = new Child(); 
instance.DoSomething(); // may expect "Child" but writes "Base" 
+0

esto no es cierto (al menos, cómo lo estoy leyendo). Si el método base está marcado como virtual, igual puede llamarlo desde el 'nuevo' método. ¿Querías decir otra cosa? – Joe

+1

@Joe - ¿Conoces la diferencia entre un 'public constructor' y un' public method'? Parece que no hablas del nuevo SomeObject (valor) sino de algo más. Deberías aclarar de qué estás hablando. –

+1

@Joe - Quise decir algo diferente. Considere que tiene una clase base llamada Base con un método llamado DoSomething. Hereda Base in Child y crea un método DoSomething con la nueva palabra clave. Si hace lo siguiente: 'Base base = new Child(); base.DoSomething(); 'llamarás a' Base.DoSomething' en lugar de 'Child.DoSomething' porque ocultaste la implementación base en Child en lugar de anularla. –

1

Una cosa new le da es la capacidad de hacer que parezca como si puede anular un método que no se declara virtual. Tenga en cuenta que no está invalidando, sino que de hecho declara un método con el mismo nombre. Para utilizar override, el método debe marcarse como virtual o abstract.

public class PolyTest 
{ 
    public void SomeMethod() 
    { 
     Console.WriteLine("Hello from base"); 
    } 
} 

public class PolyTestChild : PolyTest 
{ 
    new public void SomeMethod() 
    { 
     Console.WriteLine("Hello from child"); 
    } 
} 

En cuanto a su comentario sobre el código con errores, si la implementación base está haciendo algo que usted o la persona que llama está a la espera, que es donde el error es. Sin embargo , no lo veo como más peligroso que no llamar base.SomeMethod (cuando anulando) y que necesito.

+2

Tenga cuidado con su fraseología. nuevo nunca te permite anular nada. Le permite ocultar la implementación base. –

+1

Eso definitivamente no es una anulación; es un estándar "crear un nuevo método en la clase derivada que simplemente tiene el mismo nombre que un método en la clase base". Si un método no está marcado como 'virtual' o' abstract', entonces no puede anularlo. – dlev

+0

en el sentido más puro de la palabra 'anular' está en lo cierto, pero el OP preguntaba cuál es la diferencia. Voy a editar a la terminología correcta – Joe

0

new tiene su lugar y solo se considera una forma excelente de para corregir el código de error si no sabe cómo usarlo.

Un ejemplo:

public class A 
{ 
    public void AMethod() { } 
} 

public class B : A 
{ 
    public override void AMethod() { } 
} 

En esta situación AMethod no puede ser anulado por B porque no es virtual o abstract, por lo que con el fin de proporcionar una implementación personalizada que necesidad uso new.

+0

El uso de anulación ni nueva daría el mismo resultado que el uso de nuevo, salvo que recibiría una advertencia en tiempo de compilación. – rlesias

Cuestiones relacionadas