2012-09-30 16 views
8

que estaba leyendo un tutorial sobre la fabricación principal de costumbre, y me he encontrado con el código:lo que se protege virtual de nueva

public class BaseController : Controller 
{ 
    protected virtual new UserPrincipal User 
    { 
     get { return HttpContext.User as UserPrincipal; } 
    } 
} 

¿Cómo funciona exactamente está "protegido virtual de nuevo" trabajo?

La palabra clave "nuevo" es lo que más me confunde.

+0

Está cubierto de la documentación: http://msdn.microsoft.com/en-us/library/435f1dw2.aspx que siempre debe ser su primer puerto de escala –

Respuesta

21

protected significa que solo es visible dentro de esta clase y las clases derivadas de ella.

virtual significa que se puede anular en las clases derivadas.

new significa que aquí crea una nueva jerarquía de anulación, es decir, deja de anular el método definido en la clase base y lo reemplaza con este método.

Más detalles se pueden encontrar here

+0

Y la mayoría de las veces es una mala idea introduce un miembro 'nuevo' de una clase, que oculta un miembro que ya está allí (heredado de una clase base). ¿Por qué no simplemente elegir otro nombre (que no sea 'Usuario') para la propiedad, uno que no esté en conflicto con un miembro que ya está allí? –

+0

Bueno, es inútil tener Controller.User ya desde la clase base y Controller.CustomUser. Me gusta esta cosa con nueva, hace que mi código esté limpio. Gracias Zdeslav por una explicación detallada. –

6

new se utiliza para la ocultación de miembros.

A diferencia de un método reemplazado, no se llamará a un método new haciendo referencia a la clase base.

Ver el documentation.

3

Su pregunta clave: "Palabra clave new es lo que me confunde más"

Respuesta corta:new y override son mutuamente excluyentes. new se usa para reemplazar un miembro de clase heredado de una clase base. Por el contrario, override se usa para ampliar la implementación de la clase base de un miembro.

De new Modifier (C# Reference)(Visual Studio 2013):

Es un error usar tanto nueva y override sobre el mismo elemento, porque los dos modificadores tienen significados que se excluyen mutuamente. El modificador new crea un nuevo miembro con el mismo nombre y hace que el miembro original se oculte. El modificador anula amplía la implementación para un miembro heredado.

Cuestiones relacionadas