Назначение "base.OnNavigatedTo (e)" внутри метода переопределения OnNavigatedTo? - PullRequest
10 голосов
/ 08 марта 2012

При переопределении метода OnNavigatedTo на странице они помещают строку кода внутрь:

base.OnNavigatedTo(e);

Я удалил ее и не заметил какого-либо странного поведения.Для чего эта строка кода?Мы должны оставить это?Или это как заполнитель?

Я почти уверен, что это не относится к самому методу, так как я видел это в разных местах.Я предполагаю, что это вызывает метод OnNavigatedTo по умолчанию из класса from, от которого мы наследуем (в данном случае Page).Однако его существование на самом деле не имеет смысла, потому что, если мы этого хотим, зачем его переопределять?Может кто-нибудь объяснить, как это работает?

Ответы [ 3 ]

10 голосов
/ 09 марта 2012

Это не так придирчиво, как Android (который вылетает с SuperNotCalledException). Но вот пример того, как его оставить:

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

}

В общем, я бы назвал это. Если реализация PhoneApplicationPage изменится и в этой виртуальной функции будет больше, вы не пропустите;)

5 голосов
/ 09 марта 2012

Вы можете проверить эти вещи в отражателе.Фреймворк выполняет свою работу в методе InternalOnNavigatedTo, который вызывает пустой виртуальный метод OnNavigatedTo:

защищенный виртуальный void OnNavigatedTo (NavigationEventArgs e) {}

Вы можете удалить эту строку, у нее нет функции, но это не общее правило.Если вы не знаете, что делают базовые функции, оставьте вызовы там.

4 голосов
/ 09 марта 2012

(Не относится к OnNavigatedTo): это ограничение виртуальных методов OnXXX (или любого виртуального метода) - производный класс формально не знает, есть ли у базового класса какие-либо нетривиальные функции. В результате вы должны копаться в документации (если она существует) или полагаться на тестирование, чтобы узнать, следует ли вам вызывать базовый класс или нет. Если вам нужно использовать библиотеку someones - вызов базового метода безопаснее по умолчанию.

Существуют различные подходы к решению "нужно ли мне вызывать базовую реализацию виртуального метода" в зависимости от контекста при разработке вашей собственной библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...