所以我在我的 Xamarin 项目中工作时遇到了这个小“功能”:
public override void Draw(CGRect rect)
{
base.Draw(rect);
}
在 View 的位置绘制一个黑框(这与问题无关)。
而这段代码:
//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];
您最终会得到您所看到的行为(因为第一种情况最终会出现在您的重写代码中)。
关于c# - 为什么覆盖方法与不覆盖方法不完全相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34069186/