2013-05-04 60 views
0

我需要在超類中強制執行伊娃的初始化,但是如果沒有其他數據要初始化,通常不能初始化伊娃。這兩種方案我想到的是:在調用超類的初始化方法後強制初始化超類的伊娃

  1. 通爲伊娃要求發電關鍵父類的init方法
  2. 從調用子類的init方法的第二個超類方法

下面是例子(人爲的,非工作的)代碼。 stringBasedOnSubclassKey ivar應該從子類的關鍵方法初始化爲NSString。

@interface MySuperclass : NSObject 
    @property (nonatomic, readonly) NSString *stringBasedOnSubclassKey; 
@end 

@interface MySubclass : MySuperclass 
    @property (nonatomic, assign, readonly) int value; 
@end 

@implementation MySubclass 

- (instancetype)init 
{ 
    if (self = [super init]) { 
     _value = 30; 
    } 
    return self; 
} 

- (NSString *)key 
{ 
    return [NSString stringWithFormat:@"UniqueKey-%d", self.value]; 
} 

所以,問題是有沒有辦法強制使用「鑰匙」方法的返回值stringBasedOnSubclassKey伊娃的初始化?我不相信我可以執行上面的解決方案1和2。這些子類也可能由其他外部開發人員創建,所以關鍵方法可能比這更復雜。

更新:我正在處理此基類的現有子類,因此限制對現有子類的更改的解決方案是一個因素。

回答

1

寫出stringBasedOnSubclassKey吸氣劑以這樣的方式來強制初始化它:

- (NSString *) stringBasedOnSubclassKey { 
    if !(_stringBasedOnSubclassKey) { 
     _stringBasedOnSubclassKey = // whatever; 
    } 
    return _stringBasedOnSubclassKey; 
} 

,寫超key方法拋出異常,因此強制客戶端來覆蓋它的子類。

+0

這是一個很好的解決方案,但我希望在對象初始化時執行初始化以避免if語句。它會被時間關鍵的代碼調用數千次。我會分析一下,看看它是否真的在使用5000個呼叫中的if語句方面有很大的區別。 – dbainbridge 2013-05-04 16:25:49

+0

一個零檢查完全沒有時間。 - 但是,我的回答是基於對你的問題的誤解。我認爲重點是,直到初始化結束後才能知道密鑰。如果你能*在初始化時執行它,那麼當然在初始化時根據另一個答案執行它。 – matt 2013-05-04 16:43:37

+1

您的理解是正確的,因爲我無法保證子類在完成初始化之前已完全初始化密鑰。我能想到在init中執行的唯一方法是調用超類方法在子類init方法的末尾執行初始化。但我無法強制其他開發人員忘記在他們自己的子類中調用該方法。所以你的解決方案是最安全的,不需要現有的子類來改變。 – dbainbridge 2013-05-04 16:51:10