2014-10-02 49 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