在子类上声明一个类别

时间:2012-10-26 17:59:44

标签: iphone objective-c ios subclass categories

所以我想将一些代码重构为现有的DataManager代码。代码库太大,我们希望将其拆分为具有数据访问对象模式的单独文件。所以我想做的是

BaseDAO

然后让各个DAO继承自该类。所以我有

BaseDAO : NSObject

SomeItemDAO : BaseDAO

SomeItemDAO.m,我有

@implementation SomeItemDAO (DataManager)

但是我收到了警告,“类别正在实施一种方法,即使它的方法名称不同,它也会受到其主要类别的影响。如果您有类似

的内容,我会读到它
@interface NSArray (MyCAtegory)

你不会得到那个编译器警告。

如果是这种情况,我该如何处理我的情况呢?我做不到

@interface BaseDAO (DataManager)

编译器说它无法找到接口BaseDAO。有什么想法吗?感谢。

编辑:

+ (SomeItemDAO *)sharedInstance {
    static SomeItemDAO *instance;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        instance = [[SomeItemDAO alloc] init];
    });
    return instance;
}

- (void)someTestMethod {
    NSLog(@"test method from condition");
}

1 个答案:

答案 0 :(得分:1)

要么:实施您的

@interface SomeItemDAO (DataManager)文件中的

SomeItemDAO.h

在那里写下以下内容,

@interface SomeItemDAO (DataManager)

+ (SomeItemDAO *)sharedInstance;
- (void)someTestMethod;

@end

并从SomeItemDAO

中删除这些方法声明
@interface SomeItemDAO : BaseDAO
//remove sharedInstance and someTestMethod from here
@end

或:将其从@implementation SomeItemDAO (DataManager)

中删除
@implementation SomeItemDAO (DataManager)
//remove sharedInstance and someTestMethod from here
@end

并在此处添加

@implementation SomeItemDAO

+ (SomeItemDAO *)sharedInstance {
    static SomeItemDAO *instance;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        instance = [[SomeItemDAO alloc] init];
    });
    return instance;
}

- (void)someTestMethod {
    NSLog(@"test method from condition");
}

@end

因为您的警告消息显示 “类别正在实施一种方法,该方法也将由其主要类实现” 您的类别SomeItemDAO (DataManager)正在尝试实施已在其主类SomeItemDAO中声明的方法。因此,您应该将其从主要类@interface中删除,并将其添加到此类@intefrace.如果您希望这些方法位于@implementation SomeItemDAO,请将这些方法从@implementation SomeItemDAO (DataManager)移开并保留在那里。