Какао синглтоны и протоколы - PullRequest
4 голосов
/ 13 января 2012

Я хочу определить протокол и создать простой, стандартный способ получить «общую» реализацию этого протокола в едином стиле.Какао придерживается следующего шаблона:

[NSUserDefaults standardUserDefaults]
[NSNotificationCenter defaultCenter]

, но в обоих случаях они имеют @interfaces внизу иерархии объектов.Я борюсь с тем, как сделать это с помощью @protocols.Очевидно, я могу создать класс с пустыми или простыми реализациями методов, но в действительности мне нужен @protocol в нижней части иерархии.Я пробовал что-то вроде:

@protocol ConfigurationManager <NSObject>

//...

@interface ConfigurationManagerFactory : NSObject

+ (id<ConfigurationManager>)sharedConfiguration;

@end

// ...

id<ConfigurationManger> config = [ConfigurationManagerFactory sharedConfiguration];
[config ...];

, и это работает - но мне всегда приходится объяснять, как использовать это и почему я сделал это таким образом.Есть ли способ соответствовать синтаксису Какао (соглашение о вызовах), в то же время используя значение @protocols?

Кроме того, есть ли причина, по которой я не хотел бы использовать @protocols, как этот?Реализация @interface все еще может использовать категории и альтернативные реализации, и т. Д. - так же, как создание экземпляра NSString обычно оставляет вам класс, расширяющий NSString.

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Весь смысл протокола в том, что он определяет интерфейс без , обеспечивающего реализацию.Если вы хотите реализацию по умолчанию, предоставьте класс, который реализует ваш протокол, так же, как класс NSObject реализует протокол NSObject.Затем клиенты могут либо создать подкласс класса, который вы предоставляете, либо создать экземпляр класса, который вы предоставляете, и использовать реализацию результирующего объекта, как с вашим config объектом.

1 голос
/ 13 января 2012

Вот идея: создайте свой протокол и класс с тем же именем с помощью фабричного метода, который возвращает вам стандартную реализацию протокола:

@protocol ConfigurationManager <NSObject> ...

@interface ConfigurationManager : NSObject <ConfigurationManager> 
+(ConfigurationManager *) defaultConfigurationManager;
...

Другие специализированные реализации могут наследоваться от вашего базового класса.

...