当覆盖页面中的OnNavigatedTo方法时,他们将这行代码放在:
base.OnNavigatedTo(e);
我一直在删除它,并没有发现任何奇怪的行为。这行代码是什么?我们应该离开吗?或者这就像占位符?
我很确定这不是特定于方法本身的,因为我已经在不同的地方看到了这一点。我的猜测是,它从我们继承的类(在本例中为Page)调用默认的OnNavigatedTo方法。它的存在确实没有意义,因为如果我们想要为什么首先覆盖它?有人可以解释这是如何工作的吗?
答案 0 :(得分: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的实现发生变化,并且虚拟功能中有更多功能,那么您就不想错过;)
答案 1 :(得分:5)
你可以在反射器中检查这些东西。该框架在InternalOnNavigatedTo方法中执行它的工作,该方法调用空的OnNavigatedTo虚拟方法:
protected virtual void OnNavigatedTo(NavigationEventArgs e) { }
您可以删除该行,它没有任何功能,但这不是一般规则。如果您不知道基本功能是什么,请将呼叫留在那里。
答案 2 :(得分:4)
(不特定于OnNavigatedTo):这是虚拟OnXXX方法(或任何虚方法)的限制 - 派生类正式不知道基类是否具有任何非平凡的功能。因此,您必须深入了解文档(如果存在)或依赖测试来了解您是否应该调用基类。如果你需要使用someones库 - 调用base方法更安全。
在设计自己的库时,有不同的方法可以解决“我是否需要调用虚拟方法的基本实现”。