2013-02-06 117 views
0

SquareGeo,TriangleGeo從Geo類驅動。
每個SquareGeo,TriangleGeo類都具有相同參數但內容不同的drawMe方法。從ObjectiveC中調用子方法(IOS6)

我wantto從基類調用drawMe是地理 但是,問題導航儀說,我一個警告:

"Instance method '-drawMe' not found (return type defaults to 'id')" 

的結論是:
我如何可以調用從父方法,該方法只被定義它的所有小孩班。

我應該避免警告嗎?我應該使用協議嗎? 看起來像這樣:

[sub drawMe]; //not super 

任何想法? (請不要將我引用到java examples.only objectC專有技術)

+0

它只是一個警告。如果真的困擾你,那麼就創建一個正式的協議(也就是在父類上聲明該方法)。當然,如果你決定***不是***也聲明一個正式的協議,那麼強烈建議你在調用它之前檢查你的對象實際上是否響應'drawMe'方法。 – Perception

+0

所以你的意思是我尋找什麼的神奇鑰匙? –

+0

在這裏添加協議似乎很奇怪。基類知道它將調用一個方法,'self'是接收器,因此在這種情況下沒有其他類可以真正使用這個協議。 –

回答

0

克服這個問題的最簡單方法是在父類中提供一個空的實現。

如果你想確保子類都提供自己的實現,那麼你可以例外添加到基類的方法

@implementation Base 

- (void)drawMe; 
{ 
    [NSException raise:NSInternalInconsistencyException 
     format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]; 
} 
+0

是不是有一個在ObjectiveC中的抽象方法定義? o.h.n.o –

+0

IIRC這是最接近你可以得到 –

+0

如果我們在子類中定義drawMe與異常提升者(如你所說) 它會調用overriden?或基類的方法? 我認爲,覆蓋真的覆蓋。對嗎?所以這種方法似乎適用和最接近的解決方案 –

1

這就是關於繼承的美麗事物,您在父級聲明方法並在子級中實現它,並且底層系統處理調用「正確」該方法的版本取決於實例的實際類型。

+0

是的。 drawMe將用協議定義。 所以,一個針重寫它。確保是可以從超類返回 否則我必須爲每個子類重複定義相同的方法;它在超類中使用drawMe。 –

+0

如果您在協議中定義它,請確保父類實現該協議,否則,在父類中聲明方法,而不是協議 –

+0

,那麼我可以避免警告嗎? ,因爲我確定該方法在超類 –