【问题标题】:Objective C - Classes that share *almost* identical delegate methodsObjective C - 共享*几乎*相同的委托方法的类
【发布时间】: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。

【问题讨论】:

  • @stevesliva 谢谢!这就是我采用的方法,因为它既简单又干净。
  • 哪一个?结合类别和协议的objective-c解决方案,还是快速解决方案?如果您使用objective-c 执行此操作,我个人建议您在此处写下您自己的答案……因为另一个问题对objective-c 没有很好的指导意义。
  • 我并没有真正遵循任何具体的答案,主要是使用类别的想法帮助了我。

标签: ios objective-c delegates


【解决方案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】:

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

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

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多