2014-10-02 31 views
2

我有包含UICollectionView及其委託方法FilesViewControllerShareViewControllerUICusomtTableViewCell對象:的Objective-C繼承重複的代碼問題

- numberOfSectionsInCollectionView 

- numberOfItemsInSection 

- cellForItemAtIndexPath 

所以最後的方法是這樣的:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    SNFileCollectionViewCell *cell = (SNFileCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"FileCollectionViewCell" forIndexPath:indexPath]; 

    SNTestFile *file = [self.files objectAtIndex:indexPath.item]; 

    [cell setText:file.name]; 
    [cell setImage:file.image]; 

    return cell; 
} 

對於所有我在cellForItemAtIndexPath方法上面列出的這些對象做同樣的事情 - 它創建單元格,所以爲了優化我的代碼,我創建了BaseViewController : UIViewController並將此方法放在那裏,現在FilesViewControllerShareViewController繼承自BaseViewController並且具有創建單元格的相同功能,並且我不需要重複的代碼。

但是作爲UICusomtTableViewCell這是另一個UIViewController子類,我不能從BaseViewController繼承,因爲這是另一個東西。

所以這意味着我不能繼承我需要的功能部分,這意味着我需要複製代碼,這不是一個好的做法,因爲如果項目中的某些東西做的一樣,好的程序員永遠不會複製它。

你可以建議什麼?

所以這個想法是隻在一個地方有相同的代碼的一部分,然後我可以修改只有一個點,而不是很多點。你知道我的意思。

+0

有了所有的OOP習慣用法,很容易忘記代碼重複問題總是可以通過在一堆模塊中共享的常規輔助函數來解決。 – user3125367 2014-10-02 19:02:05

回答

0

作爲變體,您可以創建單獨的類,讓它命名爲blablablaHelper,它只有靜態方法。添加方法+(Cell *)createBlablabla:()...並在所有3個類中使用它,而不是執行基類。

+0

你的意思是擴展類NSObject? – 2014-10-02 18:51:29

+0

他的意思是創建助手類,該類將包含靜態類方法,與任何特定的類或實例無關。然後從三個[collectionView:cellForItemAtIndexPath:]的每一箇中調用常用方法。 @MatrosovAlexander – user3125367 2014-10-02 19:05:17

+0

擴展NSObject在這種情況下不太好,因爲你只能在有限的地方使用它。我的意思是你可以在你的Utils文件夾中創建另一個類,比如ShareCodeHelper或者更具體的,我有大約6個不同的幫助器(AutolayoutHelper,ModuleHelper,ServiceHelper,ProviderHelper等),我有一個靜態的通用方法(+),並且可以隨處使用它們。你的情況下,你可以添加例如+()createCellAtIndexPath()InCollectionView()方法。並在所有3個位置使用此方法作爲[blablablaHelper createCellAtIndexPath ...]。在這種情況下,您將有一個代碼進行更改。 – kabarga 2014-10-02 19:21:17