在哪里放置可选协议方法实现的通用代码?

时间:2013-03-12 22:49:52

标签: objective-c design-patterns

我有一个协议P

@protocol P<NSObject>
{

-(void)foo;

@optional

-(void)bar;

}

我有很多课程(比方说一打)。所有这些类都实现了协议P.其中大约一半实现了方法 bar ,并且所有bar实现完全相同。

分享的实施的最佳方法是什么?

明显的想法:

1)创建一些实现方法栏的基类,让其他类继承它。

实施起来很简单。但是,我不是这个想法的忠实粉丝。我更喜欢类层次结构来表示实体泛化/规范而不是代码重用。

2)创建一个帮助器并从需要实现bar方法的所有类中调用它

确定。有用。但是,如果bar的实现很小(在我的情况下是几行),那么我们将比代码本身有更多的开销(辅助类并从每个类调用它)。

还有其他(更好)的方法吗?

1 个答案:

答案 0 :(得分:4)

以下是在类之间共享方法实现的几种方法:

  1. 继承。您可以使所有类继承自实现共享方法的公共基类。但是,如果您需要A类继承UIViewController而B类继承自NSManagedObject,则不能这样做。

  2. 在所有类共享的基类上创建一个类别。例如,NSObject是(几乎)每个其他类的基类。您可以在NSObject上创建一个类别,以添加所有类继承的方法。如果这样做,您应该为方法名称添加前缀,以确保它们不会与其他名称冲突。例如。使用ronin_fooronin_bar代替foobar

  3. 创建一个文件,其中包含由@implementation块包围的方法实现。然后#include此文件位于需要这些方法的每个类的@implementation块的中间。请注意,编译器将为每个类生成机器代码的副本,这样可以使您的程序更大。

  4. 在运行时,使用Objective-C运行时API将方法从一个类复制到另一个类。您需要阅读Objective-C Runtime Programming Guide以及Objective-C Runtime Reference的部分内容。你可能还需要谷歌一些例子。