Objective C继承

时间:2011-11-09 12:09:09

标签: objective-c inheritance core-data

我正在尝试子类化一些Core Data类。我有以下课程:

核心数据类:

@interface CDExplanatoryMaterial : NSManagedObject

@property (nonatomic, retain) NSString * document;
@property (nonatomic, retain) NSString * id;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * pageNumber;
@property (nonatomic, retain) NSNumber * realPageNumber;
@property (nonatomic, retain) NSString * url;

@end

业务逻辑类的协议:

@protocol BLDataClass <NSObject>

- (NSArray*)favouriteInGroups;
@property (nonatomic, readonly, retain) NSString* type;
@property (nonatomic, readonly, retain) NSArray* inFavouriteGroups;

- (void)addAddToFavouriteGroup: (NSString*) groupName;
- (void)removeFromFavouriteGroup: (NSString*) groupName;
- (void)addToHistory;

@end

BLExplanatoryMaterial的接口:

@interface BLExplanatoryMaterial : CDExplanatoryMaterial <BLDataClass>

我得到这样的数据:

+ (NSMutableArray*) explanatoryMaterials {
    NSMutableArray* results = [[NSMutableArray alloc] init];
    for(CDExplanatoryMaterial *item in [Helper fetchDataObjectsOfType:@"CDExplanatoryMaterial"])
    {
        [results addObject: (BLExplanatoryMaterial*)item];
    }
    return results;
}

帮助程序类如下所示:

@implementation Helper
+ (NSArray*) fetchDataObjectsOfType:(NSString *)type {
    DataManager* manager = [DataManager sharedInstance];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:type inManagedObjectContext:manager.mainObjectContext];
    [fetchRequest setEntity:entity];
    NSError *error;
    NSArray *fetchedObjects = [manager.mainObjectContext executeFetchRequest:fetchRequest error:&error];
    return fetchedObjects;
}
@end

我遇到的这个问题是fetchDataObjectsOfType中的fetchedObjects数组和explainMaterials中的results数组只包含NSManagedObject对象。我希望fetchedObjects包含CDExplanatoryMaterial对象和结果以包含BLExplanatoryMaterial。我需要最终结果是BLExplanatoryMaterial对象或者我不能使用我的任何实例方法,最好的方法是什么?

谢谢,

编辑:

只是为了澄清它是下面的代码失败,因为expMat是NSManagedObject并且不支持addToFavouriteGroup方法。

NSMutableArray* expMats = [Data explanatoryMaterials];
BLExplanatoryMaterial* expMat = (BLExplanatoryMaterial*) [expMats objectAtIndex:0];
[((BLExplanatoryMaterial*)expMat) addToFavouriteGroup:@"Test Group"]

我忘记提到的一件事是我原始帖子中的所有代码都在静态库中。此编辑中发布的代码位于IOS App项目中。我不确定这是否有所作为。静态库中的所有类都标记为public。

2 个答案:

答案 0 :(得分:1)

您需要将BLExplanatoryMaterial指定为托管对象模型中实体的类。这将告诉Core Data实例化该类的对象而不是NSManagedObject

答案 1 :(得分:0)

感谢所有帮助。事实证明,因为核心数据类是在一个单独的静态库中,所以它们并没有内置到主包中。为了解决这个问题,我在主应用程序中将它们子类化,然后将核心数据文件指向那些子类。