2009-12-08 33 views
0

我有兩個相似的類,MultiSlotBlockSingleSlotBlock。他們已經開始分享大量的通用代碼,因此我決定做一些重構,並將一些方法拉到一個新的超類,我們稱之爲Block拉重構,Objective-C的

現在的我拉起來的方法,簡化的例子之一,是這樣的:

// (Block.mm) 

- (void)doACommonBehaviour 
{  
     // .. does some stuff 

     [self doAUniqueBehaviour]; 
} 

這裏的問題是,[self doAUniqueBehaviour]是顯示自然是因爲我超不實現此警告方法。

我想到的兩種解決方案對我來說聽起來不太好。一種是使用協議(我目前做的方式)像這樣:

// (Block.mm) 

- (void)doACommonBehaviour 
{  
     // .. does some stuff 

     if ([self conformsToProtocol:@protocol(UniqueBehaviourProtocol)]) 
     { 
      id<UniqueBehaviourProtocol> block = (id<UniqueBehaviourProtocol>)self; 
      [block doAUniqueBehaviour]; 
     } 
} 

另一種是有一個空白的方法體在我的父(在這種情況下,會有很多),只是回報doesNotRespondToSelector

東西刺痛感在我的腦海裏,我應該使用的策略模式,但我可能是遙遠的,我沒有經歷過,將如何實現思想。

任何想法?謝謝。

編輯:我知道一個事實,即doAUniqueBehaviour將在所有子類實現,它只是將不同的執行情況。

回答

3

超類不應該知道它的子類。你應該實現在每個子類中 - (void)doACommonBehaviour方法有:

- (void)doACommonBehaviour 
{  
     [super doACommonBehaviour]; 
     [self doAUniqueBehaviour]; 
} 

編輯 - 澄清:

如果所有的子類都將實施-doAUniqueBehaviour那麼它應該在超類(即使是空的)來實現,每個子類都會覆蓋它的需要。

如果子類1實現-doAUniqueBehaviour1,子類2實現-doAUniqueBehaviour2等等,然後按照我上面提出的那樣做;例如。在subclass1:

- (void)doACommonBehaviour 
{  
     [super doACommonBehaviour]; 
     [self doAUniqueBehaviour1]; 
} 
+0

如果我知道所有子類實現'doAUniqueBehaviour'的事實怎麼辦?我真的想在超類中爲此方法提供接口,而不是實現。 – Sam 2009-12-08 13:52:06

+1

如果他們都實現它,請將其添加到超類 - 接口和實現。然後在每個子類中獨立地覆蓋它。 – Dimitris 2009-12-08 13:58:31

+0

我認爲-doAUniqueBehaviour是由一些子類實現的。如果它是由所有子類實現的(即使以不同的方式),它應該由超類實現。然後,每個子類都將執行它自己實現此方法所需的任何操作。無論如何,不​​需要一個協議,或者超類來檢查子類可以做什麼。 – Dimitris 2009-12-08 14:06:42

2

Objective-C中沒有抽象類這樣的概念。爲了避免這個警告,你必須在你的基類中提供一個默認的實現。通常情況下,這種實現在運行時將拋出一個doesNotRespondToSelector錯誤:

- (id)someMethod:(SomeObject*)blah 
    [self doesNotRecognizeSelector:_cmd]; 
    return nil; 
} 

注:_cmd參數是調用選擇。

+0

這是一個可行的選擇,但是你真的希望一個「抽象」類是不可實例化的,而不僅僅是讓給定的方法引發異常。 – 2009-12-08 14:48:51

1

@迪米特里的建議,將工作,但的,而不是強迫每個子類來實現同樣的方法,你可以一次座聲明它,只是上面的方法(在實現文件中,而不是頭部)聲明獨特的方法,像這樣:

- (void) doUniqueBehaviour { } 

- (void) doCommonBehaviour {  
    // any common code you need 
    [self doUniqueBehaviour]; 
} 

這將防止任何編譯器警告,並且只要你喜歡,你可以覆蓋-doUniqueBehaviour在子類中。它還避免了代碼重複,並減少了在一個子類中更改代碼的可能性,但又不能改變其他代碼。另外,您不需要單獨的協議,並且動態類型被保留。

+0

是的,我的答案最初假設 - 每個小類中的-doAUniqueBehaviour都不相同。更像doAUniqueBehaviour1 doAUniqueBehaviour2等...如果所有類都實現它,它應該在超類中。 – Dimitris 2009-12-08 14:44:47