#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. Родриго, я не вижу, какую проблему (из вашего исходного поста) это не может решить.