Objective C - 共享*几乎*相同的委托方法的类

Posted

技术标签:

【中文标题】Objective C - 共享*几乎*相同的委托方法的类【英文标题】:Objective C - Classes that share *almost* identical delegate methods 【发布时间】:2016-08-09 02:11:50 【问题描述】:

我有两个类,A 类和 B 类,它们使用方法 A 和 B 实现委托。它们对方法 A 和 B 的实现可能如下所示:

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 类。有没有一种方法可以将 B 类的实现分解为两个类共享的委托类,并在需要时以某种方式将 Action 1 和 Action 6“注入”到委托方法中(对于 A 类)?如果不是,那么构建此代码的最佳方式是什么?

编辑:另外,在实际实现中,A 类和 B 类有很大不同,只是它们以相似的方式实现方法 A 和 B。

【问题讨论】:

好像你在问how to use the same category for multiple classes。 @stevesliva 谢谢!这就是我采用的方法,因为它既简单又干净。 哪一个?结合类别和协议的objective-c解决方案,还是快速解决方案?如果您使用objective-c 执行此操作,我个人建议您在此处写下您自己的答案……因为另一个问题对objective-c 没有很好的指导意义。 我并没有真正遵循任何具体的答案,主要是使用类别的想法帮助了我。 【参考方案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 中) 1.获取B的IMP:

class_getMethodImplementation(Class cls, SEL name);

2.添加IMP:

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

3.发送消息:

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

有点复杂,但符合 DRY。

【讨论】:

但是如果 A 类已经是另一个 C 类的孩子,而 B 类不是呢?在实际实现中,A 类和 B 类都实现了方法 A 和 B,但在其他方面有很大不同。 @hatooku 我明白了。更新了我的答案,希望对您有所帮助。【参考方案2】:

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

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

【讨论】:

以上是关于Objective C - 共享*几乎*相同的委托方法的类的主要内容,如果未能解决你的问题,请参考以下文章

将单例从 Objective C 共享到 Swift

创建一个对象作为委托 - Objective C

Objective c委托自我释放

主应用程序窗口的 Objective C 委托

扩展现有协议以修改 Objective C 中的委托参数

在 Objective C 中为自定义类实现委托时的引用计数