为什么重写方法与不重写方法不完全一样
本文关键字:重写 方法 一样 不完全 为什么 | 更新日期: 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];
您最终可能会看到您所看到的行为(因为第一种情况最终会出现在重写的代码中)。