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

时间:2016-08-09 02:11:51

标签: ios objective-c delegates

我有两个类,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的事实。

2 个答案:

答案 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)

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

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