2013-01-31 45 views
4

我在寫一個庫,它可能會被不屬於我的人使用。如何避免子類無意中覆蓋超類私有方法

比方說,我寫一個類:

InterestingClass.h

@interface InterestingClass: NSObject 
- (id)initWithIdentifier:(NSString *)Identifier; 
@end 

InterestingClass.m

@interface InterestingClass() 
- (void)interestingMethod; 
@end 

@implementation InterestingClass 
- (id)initWithIdentifier:(NSString *)Identifier { 
    self = [super init]; 
    if (self) { 
    [self interestingMethod]; 
    } 
    return self; 
} 

- (void)interestingMethod { 
    //do some interesting stuff 
} 
@end 

如果什麼人在後面使用的庫向下行並決定創建一個InterestingClass?的子類:

InterestingSubClass.h

@interface InterestingSubClass: InterestingClass 
@end 

InterestingSubClass.m

@interface InterestingSubClass() 
- (void)interestingMethod; 
@end 

@implementation InterestingSubClass 
- (void)interestingMethod { 
    //do some equally interesting, but completely unrelated stuff 
} 
@end 

未來庫用戶可以從公共接口initWithIdentifier是超類的一個方法見。如果他們重寫這個方法,他們可能會(正確地)假設應該在子類實現中調用superclass方法。

但是,如果它們定義了一個方法(在子類私有接口中),它在超類'私有'接口中無意中與無關方法具有相同的名稱?如果沒有他們閱讀超類私有接口,他們不會知道,而不是僅僅創建一個新的方法,他們也重寫了超類中的某些東西。子類的實現可能最終會意外調用,並且調用該方法時超類所期望完成的工作將無法完成。

我讀過的所有SO問題似乎都表明,這只是ObjC的工作方式,並沒有解決這個問題的方法。是這種情況,還是我可以做些什麼來保護我的'私人'方法不被覆蓋?

另外,是有什麼辦法範圍的從我的超類方法的調用,所以我可以肯定的是,超執行將被調用,而不是一個子類實現?

+2

不,我不認爲你可以對它做任何事情:http://stackoverflow.com/questions/12049763/how-to-avoid-accidental-overriding-method-or-property-in-objective-c – trojanfoe

回答

3

AFAIK,你可以希望被宣告覆蓋必須調用超級最好用啓動下杆前綴的方法。你可以通過在超定義方法:

- (void)interestingMethod NS_REQUIRES_SUPER; 

這將編譯時標誌不調用super任何覆蓋。

+0

這是一個非常可行的(可能更乾淨的)替代方案,在我所有的方法名稱之前添加某種獨特的字符串。乾杯! – sjwarner

+0

按照[this](http://www.dudas.co.uk/ns_requires_super/)的討論,可以用以下語句使clang警告消失:'#pragma clang diagnostic push \ #pragma clang diagnostic ignored「-Wobjc-missing -super-calls「\ \ #pragma clang diagnostic pop' – sjwarner

+0

@Clay,這對我沒有解決。這隻會添加警告! – orafaelreis

1

對於框架代碼來說,處理這個問題的一個簡單方法是隻給所有私有方法一個私有前綴。

您經常會注意到堆棧跟蹤中Apple框架調用的私有方法通常從_開始。

如果您確實提供了一個外部使用框架,人們無法看到您的來源,這隻會是真正的問題。

NB
不要因爲這一慣例已被保留

相關問題