我在寫一個庫,它可能會被不屬於我的人使用。如何避免子類無意中覆蓋超類私有方法
比方說,我寫一個類:
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的工作方式,並沒有解決這個問題的方法。是這種情況,還是我可以做些什麼來保護我的'私人'方法不被覆蓋?
另外,是有什麼辦法範圍的從我的超類方法的調用,所以我可以肯定的是,超執行將被調用,而不是一個子類實現?
不,我不認爲你可以對它做任何事情:http://stackoverflow.com/questions/12049763/how-to-avoid-accidental-overriding-method-or-property-in-objective-c – trojanfoe