Создавать категории, неотъемлемо или делегировать?

#objective-c #inheritance #delegates #categories

#objective-c #наследование #делегаты #Категории

Вопрос:

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

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

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

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

 //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 defined, #elif defined … каждый раз, когда мне нужно создать вызов объекта. С категориями мне нужно сделать это только с помощью «#include».

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

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

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

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

Ответ №1:

во многих случаях композиция сослужила бы вам хорошую службу.

Комментарии:

1. Я не понял, как это может помочь-мне. Это всего лишь создание другого класса с некоторыми данными или функцией. Я думаю, это похоже на создание определенного класса. Но спасибо за советы.

2. Родриго, я не вижу, какую проблему (из вашего исходного поста) это не может решить.