为什么覆盖一个方法与不覆盖方法完全相同?

时间:2015-12-03 14:58:56

标签: c# xamarin xamarin.ios override

所以我在我的Xamarin项目中工作并遇到了这个小小的“功能”:

if (ModifierKeys == Keys.None) ...

在视图的位置绘制一个黑框(这与问题无关)。

这段代码:

public override void Draw(CGRect rect)
{
    base.Draw(rect);
}

绘制一个透明框(同样,该方法的确切结果与问题无关)。

现在我想知道(在C#的层面上)这两个实现有何不同。根据我的理解,这2段代码在功能上是相同的,但它们显然不是,因为它们会导致2种​​不同的结果。

发生了什么事?

1 个答案:

答案 0 :(得分:2)

从纯粹的C#角度来看,这两种方法在99.9999%的时间内的行为应该相同。调用者可以确定某个方法是否被覆盖,并执行不同的代码路径,但这很麻烦,而且不是人们在C#中做的事情。

然而,在Objective-C中,在调用方法之前检查方法是否更容易(实际上是一个常见的习语)。

这意味着如果Objective-C做了类似这样的事情:

if ([obj respondsToSelector: @selector (drawRect:)])
    [obj drawRect: theRect];
else
    [obj doSomethingElse];

你最终可能会看到你所看到的行为(因为第一个案例会以你的被覆盖的代码结束)。