我想定义一个协议并创建一种简单,标准的方法来获取所述协议的“默认”共享实现 - 单例样式。可可坚持以下模式:
[NSUserDefaults standardUserDefaults]
[NSNotificationCenter defaultCenter]
但在这两种情况下,它们在对象层次结构的底部都有@interfaces。我正在努力使用@protocols来完成这项工作。我显然可以创建一个具有空或简单方法实现的类 - 但实际上,我想要的是层次结构底部的@protocol。我尝试过类似的东西:
@protocol ConfigurationManager <NSObject>
//...
@interface ConfigurationManagerFactory : NSObject
+ (id<ConfigurationManager>)sharedConfiguration;
@end
// ...
id<ConfigurationManger> config = [ConfigurationManagerFactory sharedConfiguration];
[config ...];
并且它有效 - 但我总是要解释如何使用它以及为什么我这样做。有没有办法符合Cocoa的语法(调用约定),同时仍然利用@protocols的值?
顺便说一下,有没有理由我不想像这样使用@protocols?实现@interface仍然可以利用类别和替代实现等 - 就像实例化NSString通常会让你有一个扩展NSString的类。
答案 0 :(得分:2)
协议的重点在于它指定了一个接口,而提供了一个实现。如果您想要一个默认实现,请提供一个实现您的协议的类,就像NSObject类实现NSObject协议一样。然后,客户端可以子类化您提供的类,也可以实例化您提供的类,并使用生成的对象的实现,就像使用config
对象一样。
答案 1 :(得分:1)
这是一个想法:使用工厂方法创建您的协议和具有相同名称的类,该方法返回协议的默认实现:
@protocol ConfigurationManager <NSObject> ...
@interface ConfigurationManager : NSObject <ConfigurationManager>
+(ConfigurationManager *) defaultConfigurationManager;
...
然后,其他专用实现可以从您的基类继承。