2016-08-09 75 views
1

我有兩個類,A類和B類,它們使用方法A和B實現代理。它們的方法A和B的實現可能如下所示:Objective C - 共享*幾乎*相同委託方法的類

Class A { 
    Method A { 
     Action 1; 
     Action 2; 
     Action 3; 
    } 
    Method B { 
     Action 4; 
     Action 5; 
     Action 6; 
    } 
} 

Class B { 
    Method A { 
     Action 2; 
     Action 3; 
    } 
    Method B { 
     Action 4; 
     Action 5; 
    } 
} 

這兩個類實現兩個幾乎相同的委託方法,除了在每個方法中,類B比類A執行的操作少。有沒有一種方法可以將Class B的實現分解爲兩個類共享的委託類,並在需要時(對於Class A)以某種方式將Action 1和Action 6「注入」到委託方法中?如果不是,那麼構造這些代碼的最好方法是什麼?

編輯另外,在實際的實現中,除了A類和B類以類似的方式實現方法A和B之外,類A和類B是非常不同的。

+0

看起來像你問[如何使用多個類相同的類別](http://stackoverflow.com/questions/9450556/adding-the-same-category-to-multiple-classes)。 – stevesliva

+0

@stevesliva謝謝!因爲它簡單而乾淨,所以我採用了這種方法。 – hatooku

+0

哪一個?結合了類別和協議的快速目標解決方案?如果你用objective-c來做到這一點,我個人建議在這裏寫下自己的答案......因爲另一個問題並沒有爲Objective-C做一個很好的指導。 – stevesliva

回答

1

最好的方法是繼承。就像這樣:

Class A: B { 
    Method A { 
     Action 1; 
     super.Method A; 
    } 
    Method B { 
     Action 4; 
     super.Method B; 
    } 
} 

Class B { 
    Method A { 
     Action 2; 
     Action 3; 
    } 
    Method B { 
     Action 4; 
     Action 5; 
    } 
} 

更新

閱讀您的評論之後,我覺得動態信息調度也許幫助(下面的所有代碼是在A)B的 1.Get IMP:

class_getMethodImplementation(Class cls, SEL name); 

2.增加IMP:

class_addMethod(Class cls, SEL name, IMP imp, const char *types); 

3.Send消息:

objc_msgSend(self, SEL name, parameter1, parameter2, parameter3); 

它有點複雜但符合DRY。

+0

但是,如果A類已經是一個不同的C類的孩子,但是B類不是?在實際的實現中,A類和B類都實現方法A和B,但在其他方面有很大不同。 – hatooku

+0

@hatooku我明白了。更新我的答案,並希望它能幫助你。 – Lumialxk

0

將通用代碼分解爲新類始終是可能的,並且通常是一個好主意。但是,我們無法知道方法的實現是否足夠類似於不同類的共享。只有你會知道這一點。另外,如果實現需要內部知識或訪問宿主類的內部狀態,則會發現難以重構。你可能最終造成比你開始時更大的混亂。

最終,您需要評估具體情況並確定實現是否真的相同,或者每個類使用的委託方法不同。

相關問題