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 - 共享*几乎*相同的委托方法的类的主要内容,如果未能解决你的问题,请参考以下文章