2015-12-03 39 views
3

所以我在Xamarin項目工作和整個這個小一點的「功能」來了:爲什麼重寫方法與重寫方法不完全相同?

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

在視圖(這是什麼究竟是無關的問題)的地方繪製一個黑盒子。

鑑於此代碼:

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

繪製的透明箱(再次該方法的精確結果是無關的問題)。

現在我想知道(在C#的水平上)這兩個實現有何不同。根據我的理解,這兩段代碼在功能上是相同的,但顯然不是,因爲它們會導致2種​​不同的結果。

這是怎麼回事?

+2

第二個是未註釋的,並且根本沒有編譯,這意味着它不存在於執行代碼中。 – HimBromBeere

+1

是的,但在我的理解中,這些應該在功能上是相同的,因爲我用它自己覆蓋了一個基本方法。 – vrwim

+5

我認爲被問到的問題是爲什麼簡單地調用base.Draw在重寫的方法中沒有任何更改會以某種方式得到不覆蓋它的不同結果。 – Tofystedeth

回答

2

從純粹的C#視角來看,這兩個方法的表現應該是99.9999%的時間。調用者可以確定某個方法是否被覆蓋,並執行不同的代碼路徑,但這很麻煩,而且不是人們在C#中做的事情。

但是在Objective-C中,在調用它之前檢查一個方法是否被實現是很容易的(並且實際上是一個普通的習慣用法)。

這意味着,如果Objective-C的做這樣的事情:

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

你可以結束了,你所看到的行爲(因爲第一種情況下,在您的重寫代碼結束)。

+1

是的,但即使如此,它應該始終運行第一個代碼,因爲它總是在基類中實現,因爲它總是響應選擇器。 – vrwim

+0

在Xamarin.iOS中,即使存在「基」方法,也只有被顯式覆蓋的方法纔會報告給Objective-C運行時。 –