2012-03-08 19 views
9

當覆蓋在頁面中的OnNavigatedTo方法,他們把裏面這行代碼:OnNavigatedTo覆蓋方法內的「base.OnNavigatedTo(e)」的用途?

base.OnNavigatedTo(e); 

我已經刪除它,並沒有發現任何奇怪的行爲。這行代碼是什麼?我們應該離開嗎?或者這就像一個地方持有人?

我很確定這不是特定於方法本身,因爲我已經在不同的地方看到了這一點。我的猜測是,它會從我們繼承的類中調用默認的OnNavigatedTo方法(在本例中爲Page)。它的存在並不是真的有意義,因爲如果我們想要爲什麼重寫它呢?有人可以解釋這是如何工作的?

回答

10

它不像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的實現發生變化,並且虛擬函數有更多內容,則不想錯過;)

4

(不特定於OnNavigatedTo):這是虛擬OnXXX方法(或任何虛擬方法)的限制, - 派生類正式不知道基類是否有任何非平凡的功能。因此,你必須深入研究文檔(如果存在的話)或依靠測試來知道你是否應該調用基類。如果您需要使用某些庫 - 調用基本方法是更安全的默認方法。

當您設計自己的庫時,根據上下文有不同的方法來解決「我需要調用基礎實現虛擬方法」。

5

你可以在反射器中檢查這些東西。該框架確實是在InternalOnNavigatedTo方法,它調用空的OnNavigatedTo虛擬方法工作:

保護的虛擬無效的OnNavigatedTo(NavigationEventArgs E) { }

可以刪除線,它沒有功能,但這不是一個通用規則。如果您不知道基本功能是什麼,請將電話留在那裏。