我有两个类,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类的实现分解为一个由两个类共享的委托类,并以某种方式" inject"动作1和动作6在需要时进入委托方法(对于A类)?如果没有,那么构建此代码的最佳方法是什么?
编辑:另外,在实际实现中,A类和B类是完全不同的,除了它们以类似的方式实现方法A和B的事实。
答案 0 :(得分: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。
答案 1 :(得分:0)
将公共代码分解为新类总是有可能的,而且往往是个好主意。但是,我们无法知道方法的实现是否足够相似以供不同类共享。只有你会知道。此外,如果实现需要内部知识或访问主机类的内部状态,您将发现很难重构。你最终可能会比你开始时造成更大的混乱。
最终,您需要评估具体情况并确定实现是否真的相同,或者每个类是否使用不同的委托方法。