2012-03-08 6 views
9

Kiedy przesłanianie metody OnNavigatedTo w stronę ich umieścić ten wiersz kodu wewnątrz:Cel "base.OnNavigatedTo (e)" wewnątrz metody nadpisania OnNavigatedTo?

base.OnNavigatedTo(e); 

byłem usuwając go i nie zauważyłem dziwne zachowanie. Do czego służy ta linia kodu? Czy mamy to zostawić? Czy to jest jak miejsce na miejsce?

Jestem prawie pewny, że nie jest to specyficzne dla samej metody, ponieważ widziałem to w różnych miejscach. Domyślam się, że to wywołuje domyślną metodę OnNavigatedTo od klasy, od której dziedziczymy (w tym przypadku Strona). Jego istnienie nie ma jednak większego sensu, ponieważ gdybyśmy chcieli, po co to w ogóle zastąpić? Czy ktoś może wyjaśnić, jak to działa?

Odpowiedz

10

To nie jest tak wybredna jak Android (który zawiesza się z SuperNotCalledException). Ale tutaj jest przypadek użycia, aby go zostawić:

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.) 
    } 

} 

Ogólnie, nazwałbym to. Jeśli implementacja PhoneApplicationPage ulegnie zmianie, a funkcja Virtual ma w niej więcej, nie chcesz tego przegapić;)

4

(Niepecyficzne dla OnNavigatedTo): To jest ograniczenie wirtualnych metod OnXXX (lub dowolnej metody wirtualnej) - klasa pochodna formalnie nie wie, czy klasa podstawowa ma jakąś nietrywialną funkcję. W rezultacie musisz zagłębić się w dokumentację (jeśli taka istnieje) lub polegać na testach, aby wiedzieć, czy powinieneś zadzwonić do klasy bazowej, czy nie. Jeśli potrzebujesz użyć biblioteki someones - metoda wywołania jest bezpieczniejsza domyślnie.

Istnieją różne podejścia do rozwiązania problemu "czy należy wywoływać podstawową implementację wirtualnej metody" w zależności od kontekstu podczas projektowania własnej biblioteki.

5

Możesz sprawdzić te rzeczy w reflektorze. Ramy robi to praca w metodzie InternalOnNavigatedTo, który wzywa pustą metodę OnNavigatedTo wirtualny:

chroniony virtual void OnNavigatedTo (NavigationEventArgs e) { }

Można usunąć tę linię, to nie ma żadnej funkcji, ale nie jest to ogólna zasada. Jeśli nie wiesz, jakie są podstawowe funkcje, zostaw tam połączenia.

Powiązane problemy