2012-09-30 17 views
8

stavo leggendo un tutorial su come rendere principal personalizzato, e ho incontrato il codice:Ciò che è protetto virtuale nuova

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

Come esattamente è "protetto virtuale nuova" di lavoro?

chiave di "nuovo" è quello che mi confonde più.

+0

E 'coperto nella documentazione: http://msdn.microsoft.com/en-us/library/435f1dw2.aspx che dovrebbe sempre essere il primo porto di scalo –

risposta

21

protected significa che è visibile solo all'interno di questa classe e classi derivate da esso.

virtual significa che può essere annullato nelle classi derivate.

new significa che qui si crea nuova gerarchia assoluta, vale a dire si interrompe l'override del metodo definito nella classe base e sostituirlo con questo metodo.

Maggiori dettagli possono essere trovati here

+0

E la maggior parte del tempo è una cattiva idea introdurre un membro 'new' di una classe, che nasconde un membro già presente (ereditato da una classe base). Perché non scegliere semplicemente un altro nome (di "Utente") per la proprietà, che non è in conflitto con un membro già presente? –

+0

Bene, è quasi inutile avere Controller.User già dalla classe base e da Controller.CustomUser. Mi piace questa cosa con le novità, rende il mio codice pulito. Grazie a Zdeslav per la spiegazione dettagliata. –

6

new viene utilizzato per nascondere i membri.

A differenza di un metodo sottoposto a override, un metodo new non verrà chiamato da un riferimento alla classe base.

Vedere documentation.

3

tua domanda chiave: "Parola new è ciò che mi confonde il più"

Risposta breve:new e override si escludono a vicenda. new è usato per sostituire un membro della classe ereditata da una classe base. Al contrario, override è usato per estendere l'implementazione della classe base dell'utente.

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

E 'un errore di utilizzare sia nuovo e override sullo stesso elemento, perché i due modificatori hanno significati si escludono a vicenda. Il modificatore nuovo crea un nuovo membro con lo stesso nome e fa diventare nascosto il membro originale . Il sostituzione modificatore estende l'attuazione di membro ereditato.

Problemi correlati