为什么重写方法与不重写方法不完全一样

本文关键字:重写 方法 一样 不完全 为什么 | 更新日期: 2023-09-27 18:25:34

所以我在Xamarin项目中遇到了这个小"功能":

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

在视图的位置绘制一个黑框(这到底做了什么与问题无关)。

而这个代码:

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

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

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

发生了什么事?

为什么重写方法与不重写方法不完全一样

从纯C#的角度来看,这两种方法在99.9999%的情况下应该表现相同。调用方可以确定某个方法是否被重写,并执行不同的代码路径,但这很麻烦,人们在C#中无法做到这一点。

然而,在Objective-C中,在调用方法之前检查方法是否已实现要容易得多(事实上也是一个常见的习惯用法)

这意味着,如果Objective-C这样做:

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

您最终可能会看到您所看到的行为(因为第一种情况最终会出现在重写的代码中)。