2017-03-02 90 views
7

我有這樣的事情:使用__attribute __((objc_requires_super))與協議

@protocol MyProtocol <NSObject> 

- (void)oneMethod; 

@end 

@interface BaseClassWithProtocol : NSObject <MyProtocol> 

@end 

@interface ChildClassWithProtocol : BaseClassWithProtocol 

@end 

BaseClassWithProtocol已實施oneMethod,我想顯示警告,如果ChildClassWithProtocol不在其oneMethod實現中調用超。

但我不知道我應該在哪裏寫__attribute__((objc_requires_super))

將它寫入協議不支持,而在.h中重新定義oneMethod看起來很愚蠢。

那麼有沒有什麼標準的方法可以處理這個問題?

回答

7

調用super的要求是BaseClassWithProtocol。這不是協議的一部分。當然,有些課程可能會實施MyProtocol,但是如果沒有強制要求,則可以實施。這是協議的本質。他們強加接口,而不是實現。

因此,用屬性重新聲明BaseClassWithProtocol中的方法對我來說似乎是非常明智的。不知道爲什麼它「看起來很愚蠢」。

+0

謝謝。 在.h中重新聲明oneMethod不會覆蓋接口,它恰好與協議中聲明的聲明相同。我不知道我的理解是否正確。但是,如果在.h和協議中聲明的這兩個方法具有相同的名稱但參數類型不同呢?這就是爲什麼我認爲它很愚蠢,因爲我不知道哪一個是最終的聲明,而且兩次聲明似乎很冗長。但是,它似乎是我可以放入鐺屬性的唯一地方,我將採取這一做法。 – Tepmnthar

+0

但是,你能告訴我swift協議擴展是否可以做到這一點(我對swift知之甚少)。或者你能告訴我如何用一個具有協議和抽象類的類(不是其他語言中的「抽象類」,僅僅意味着比其子的抽象更抽象,也許不實現某些方法),使用宏/鏗鏘屬性/還是其他? – Tepmnthar

+0

@Tepmnthar同名,但參數類型不同?這兩種方法將被視爲兩種不同的方法,因爲Objective-C沒有*方法重載* – nayem

1

協議並不意味着爲您的各種實現提供警告。他們只會警告你是否同意在你的實施中包含所需的方法。但是,如何實現這些方法,這取決於採用該協議的類。也就是,你應該在你的.h或者.m文件中有你需要的功能。

考慮是這樣的:

您的協議,其中你想擁有的超級電話報警的方法。現在你在NSObject的子類中使用協議。但NSObject類不符合您定義的協議。你現在應該爲你的班級收到警告嗎? 根據你的要求,你應該得到這個警告。但事實並非如此。你幾乎從來不會通過這個程序得到這個警告。

+0

謝謝。我明白。只是沒有看到在\ @protocol和\ @interface中聲明瞭兩次並感覺有點好奇的方法。 – Tepmnthar