Создавать категории, подчинение или делегировать? - PullRequest
0 голосов
/ 27 мая 2011

У меня небольшая проблема.Мой сценарий таков: я создам проект с большим количеством целей.Я хочу иметь «открытый код» (для всех целей) и «конкретный код».Проблема в следующем: В «открытом коде» мне НУЖНА вызывать функцию в «конкретном коде».

Моя первая попытка состояла в использовании категорий.Я создаю "public.h", а затем "public + specific.h" коды с использованием категорий.Класс, который будет использовать этот класс, должен будет:

#import "public+specific.h"
...
public *myClass = [[public alloc] init];
[myclass doSomething];

Чтобы использовать другой определенный класс, мне нужно только изменить # import и ничего более.Уникальная проблема заключается в том, что в «публичном классе» мне потребуется создать ложную функцию, например.

//public.h
@interface public : NSObject {}
...
- (void) doSomething {return };

//public+specific.h
@interface public (specific)
...
 - (void) doSomething { //do what it really have to do };

Другие проблемы присущи категориям: я не могу создать локальную переменную класса, все придетсябыть объявленным в "public.h".Я хочу иметь все конкретные вещи в определенном классе ...

Хорошо, поэтому я пытаюсь по-другому: использовать наследование с делегатами.В классах "public.h" и "public + specific.h" это работает очень хорошо, нет необходимости использовать поддельные функции, все было хорошо.НО, (всегда, но), мне всегда придется выделять определенный класс, и если я этого не хочу, я могу создать поддельную функцию только для вызова делегата, поэтому у меня та же проблема, что и выше.Вот пример:

  //In public.h
  @protocol publicDelegate
    -(void)doSomething;
  @end
  @interface public : NSObject {
      id <publicDelegate> myDelegate;
   }
   -(id)initWithDelegate (id <publicDelegate>)initDelegate{
       myDelegate = initDelegate;
       [myDelegate doSomehing];
   }

   //public+specific.h   //The '+' isn't correct here :P
   #include public.h
   @interface public_specific : public <publicDelegate> {}
   - (id)init{
        return [super initWithDelegate:self];
   }  
   - (void) doSomething { //do what it really have to do };

Как я уже сказал, проблема в том, как я создаю этот объект

   #import "public+specific.h"
   ...
   public_specific *myClass = [[public_specific alloc] init];
   [myClass doSomething];

. С этим мне придется создать много #ifопределено, #elif определено ... каждый раз, когда мне нужно создать объектный вызов.Для категорий мне нужно сделать это только с "# include" .

. Чтобы решить эту проблему, у меня могут быть такие вещи:

    //in "public.h"
    - (void) doSomething { 
         return [myDelegate doSomehing]
    };

Другойраз я создам фальшивую функцию.И что хуже всего, для каждой новой функции в "public + specific.h" мне придется создавать еще одну фальшивую функцию .. zzz .. (в категориях я должен делать это только с функцией с вызовом "public.h" в "public"+ specific.h ")

Итак, у кого-нибудь есть другая идея для этой проблемы ??Это небольшая проблема, но я хочу сделать мой код хорошим, простым в разработке и очистке ...

1 Ответ

0 голосов
/ 27 мая 2011

во многих случаях композиция будет вам полезна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...