Внедрение зависимостей с помощью @protocol? - PullRequest
1 голос
/ 20 февраля 2012

Могу ли я использовать @protocol для взаимодействия между классами?Моя главная цель - внедрить некоторые зависимости, как в Java (с интерфейсами и реализациями).

У меня есть следующие классы: SignUpServiceImpl (который имеет интерфейс с именем SignUpService) и ServiceHelperImpl(интерфейс ServiceHelper).

Я не хочу соединять обе реализации вместе, поэтому я использую @protocol в ServiceHelper, который реализуется ServiceHelperImpl.Затем SignUpServiceImpl инициализируется с ServiceHelper следующим образом:

- (id)initWithHelper:(ServiceHelper *)myServiceHelper

Возможно ли то, что я пытаюсь достичь?В Java это выглядит намного проще ...

Ответы [ 3 ]

0 голосов
/ 20 февраля 2012

Если вы хотите оставить ряд различных реализаций за единым интерфейсом класса, один из способов сделать это в Objective-C - создать абстрактный класс SignUpService, а затем в методе init SignUpService,вместо возврата self вы фактически возвращаете экземпляр класса, который хотите реализовать, поэтому в вашем случае SignUpServiceImpl.

Так работают некоторые кластеры классов в Какао, такие как NSString.

Дайте мне знать, если вам нужна дополнительная информация.

0 голосов
/ 20 февраля 2012

Протокол objc очень похож на интерфейс Java.

Точкой блокировки может быть то, как вы ожидаете, что вещи на самом деле связаны друг с другом - или синтаксис протокола.

Объявление протокола:

@protocol ServiceHelperProtocol
- (void)help;
@end

Используйте его в классе:

@interface SomeClass : NSObject
- (id)initWithServiceHelper:(id<ServiceHelperProtocol>)inServiceHelper;
@end

@implementation SomeClass

- (id)initWithServiceHelper:(id<ServiceHelperProtocol>)inServiceHelper
{
  self = [super init];
  if (nil != self) {
    [inServiceHelper help];
  }
  return self;
}

@end

MONHelper принимает протокол:

@interface MONHelper : NSObject < ServiceHelperProtocol > 
...
@end

@implementation MONHelper
- (void)help { NSLog(@"helping..."); }
@end

Используется:

MONHelper * helper = [MONHelper new];
SomeClass * someClass = [[SomeClass alloc] initWithServiceHelper:helper];
...
0 голосов
/ 20 февраля 2012

Чтобы принять объект, соответствующий протоколу, ваш метод init должен выглядеть следующим образом:

- (id)initWithHelper:(id<ServiceHelper>)myServiceHelper
...