2012-03-08 7 views
9

Al reemplazar el método OnNavigatedTo en una página que coloque esta línea de código dentro:Propósito de "base.OnNavigatedTo (e)" dentro del método OnNavigatedTo override?

base.OnNavigatedTo(e); 

He estado retirarlo y no he notado ningún comportamiento extraño. ¿Para qué es esta línea de código? ¿Se supone que debemos dejarlo? ¿O es esto como un marcador de posición?

Estoy bastante seguro de que esto no es específico del método en sí, ya que he visto esto en diferentes lugares. Supongo que esto llama al método predeterminado OnNavigatedTo desde la clase de la que estamos heredando (en este caso, la página). Sin embargo, su existencia en realidad no tiene sentido, porque si quisiéramos, ¿por qué anularla en primer lugar? ¿Alguien puede explicar cómo funciona esto?

Respuesta

10

No es tan selectivo como es Android (que se bloquea con SuperNotCalledException). Pero aquí hay un caso de uso para dejarlo:

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

} 

En general, lo llamaría. Si la implementación de PhoneApplicationPage cambia, y esa función Virtual tiene más, no se lo debe perder;)

4

(No específico de OnNavigatedTo): Esto es una limitación de los métodos virtuales de OnXXX (o cualquier método virtual) - La clase derivada formalmente no sabe si la clase base tiene alguna funcionalidad no trivial. Como resultado, tiene que profundizar en la documentación (si existe) o confiar en las pruebas para saber si debería llamar a la clase base o no. Si necesita usar la biblioteca de alguien, el método de base de llamadas es el más seguro predeterminado.

Existen diferentes enfoques para resolver "¿Necesito llamar a la implementación base del método virtual?" Según el contexto cuando diseña su propia biblioteca.

5

Puede verificar estas cosas en el reflector. El marco hace su trabajo en el método InternalOnNavigatedTo, que llama al método OnNavigatedTo virtual de vacío:

virtual protegida vacío OnNavigatedTo (NavigationEventArgs e) { }

Puede eliminar esa línea, no tiene ninguna función, pero esta no es una regla general Si no sabe cuáles son las funciones base, deje las llamadas allí.

Cuestiones relacionadas