2016-08-09 48 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

将通用代码分解为新类始终是可能的,并且通常是一个好主意。但是,我们无法知道方法的实现是否足够类似于不同类的共享。只有你会知道这一点。另外,如果实现需要内部知识或访问宿主类的内部状态,则会发现难以重构。你可能最终造成比你开始时更大的混乱。

最终,您需要评估具体情况并确定实现是否真的相同,或者每个类使用的委托方法不同。

相关问题