2012-03-08 10 views
9

Quando l'override del metodo OnNavigatedTo in una pagina hanno posto questa riga di codice all'interno:Scopo di "base.OnNavigatedTo (e)" all'interno del metodo di sovrascrittura OnNavigatedTo?

base.OnNavigatedTo(e); 

ho rimuoverlo e non ho notato alcun comportamento strano. A cosa serve questa linea di codice? Dovremmo lasciarlo? O è come un segnaposto?

Sono sicuro che questo non è specifico del metodo stesso, come ho visto in posti diversi. La mia ipotesi è che questo chiama il metodo OnNavigatedTo predefinito dalla classe che stiamo ereditando da (in questo caso Pagina). Tuttavia, la sua esistenza non ha molto senso, perché se volessimo questo perché annullarla in primo luogo? Qualcuno può spiegare come funziona?

risposta

10

Non è così esigente come Android (che si blocca con SuperNotCalledException). Ma ecco un caso d'uso per lasciarlo:

public class BasePage : PhoneApplicationPage 
    { 
     protected override OnNavigatedTo(....) 
    { 
     //some logic that should happen on all your pages (logging to console, etc.) 
    } 
    } 

    public class DetailsPage : BasePage 
    { 
     protected override OnNavigatedTo(....) 
    { 
    base.OnNavigatedTo(); //the basepage logging, etc. 
     //custom page logic (setup VM, querystring parameters, etc.) 
    } 

} 

In generale, lo chiamerei. Se l'implementazione di PhoneApplicationPage cambia, e la funzione Virtuale ha più in esso, non si vuole perdere;)

4

(Non specifico per OnNavigatedTo): questa è la limitazione dei metodi OnXXX virtuali (o qualsiasi metodo virtuale) - la classe derivata formalmente non sa se la classe base ha una funzionalità non banale. Come risultato, devi scavare nella documentazione (se esiste) o fare affidamento sui test per sapere se dovresti chiamare la classe base o no. Se è necessario utilizzare la libreria someones, il metodo base di chiamata è un valore predefinito più sicuro.

Esistono diversi approcci per risolvere "devo chiamare l'implementazione di base del metodo virtuale" in base al contesto quando si progetta la propria libreria.

5

È possibile controllare queste cose nel riflettore. Il quadro fa il suo lavoro nel metodo InternalOnNavigatedTo, che chiama il metodo OnNavigatedTo virtuale vuoto:

protetta virtuale vuoto OnNavigatedTo (NavigationEventArgs e) { }

È possibile eliminare quella linea, non ha alcuna funzione, ma questa non è una regola generale. Se non sai quali sono le funzioni di base, lascia le chiamate lì.

Problemi correlati