【发布时间】:2011-05-27 16:40:05
【问题描述】:
我有一个小问题。我的场景是:我将构建一个有很多目标的项目。我想要“公共代码”(针对所有目标)和“特定代码”。问题是:在“公共代码”中,我需要在“特定代码”处调用函数。
我的第一次尝试是使用类别。我使用类别创建“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 defined ,#elif defined...。对于类别,我只需要使用 "#include" 来执行此操作。
为了解决这个问题,我可以有这样的东西:
//in "public.h"
- (void) doSomething {
return [myDelegate doSomehing]
};
另外一次我将创建假函数。最糟糕的是,对于“public+specific.h”中的每个新函数,我将不得不创建另一个假函数.. zzz..(在类别中,我必须只对“public”中调用“public.h”的函数执行此操作+specific.h")
那么,有人对这个问题有其他想法吗?这是一个小问题,但我想让我的代码好,易于开发和清理......
【问题讨论】:
标签: objective-c inheritance delegates categories