需要子类化NSManagedObject的自定义类的子类

时间:2013-06-10 15:51:44

标签: ios core-data inheritance nsmanagedobject

所以这就是我的困境。我正在处理遗留代码并尝试简化并减少代码库中的大量冗余。这是问题的症结所在。我正在尝试将两个非常相似的类合并为一个超类/子类关系。一个是NSObject的子类,另一个是NSManagedObject的子类。

我有一个只包含名为InventoryItems.h的变量的类。它是NSObject的子类。

@property (nonatomic, retain) NSString * desc;
@property (nonatomic, retain) NSString * locationInventoryId;
...

InventoryItems.m

@synthesize desc;
@synthesize locationInventoryId;
...

还有另一个名为FavoriteInventoryItems.h的类,它是NSManagedObject的子类。 它包含与InventoryItems完全相同的变量和一个附加变量。

FavoriteInventoryItems.h

@property (nonatomic, strong) NSString * desc;
@property (nonatomic, strong) NSString * locationInventoryId;
@property (nonatomic, strong) NSString * dateAddedAsFav;
....

FavoriteInventoryItems.m

@dynamic desc;
@dynamic locationInventoryId;
@dynamic dateAddedAsFav;
...

我可以通过使InventoryItems成为NSManagedObject的子类,然后使FavoriteInventoryItems成为InventoryItems的子类来成功地完成工作。它确实有效,但我收到一条消息,表明以下内容:

CoreData:错误:无法在NSManagedObject类'InventoryItems'上调用指定的初始值设定项

我的解决方案肯定是一个可能产生负面后果的黑客攻击。

有多个地方的代码类似于以下内容:

if (InventoryItem)
    ...many lines of code here
else if(FavoriteInventoryItem)
    ...exact same code as above based on favorites

我不确定如何将这两个类合并到超类/子类关系中。或者有没有更好的方法来处理不涉及继承的问题?有什么想法吗?

1 个答案:

答案 0 :(得分:3)

尝试使用协议来指定类之间的共同点,并允许“使用”代码对协议是通用的。

协议的规范是重要的部分,实现已经存在于您拥有的2个类中。规范将列出两个类之间的常用方法(或属性)。然后,在重复的代码中,而不是说:

InventoryItem *item = ...

FavoriteInventoryItem *item = ...

你会说:

id < InventoryItem > item = ...

我正在复制名称,因为我无法知道更好的名称是什么,但协议定义为:

@protocol InventoryItem < NSObject >

@property (nonatomic, strong) NSString * desc;
@property (nonatomic, strong) NSString * locationInventoryId;

@end

然后使用协议的代码不关心底层类是什么,它只关心协议提供的内容:

item.desc = @"Teddies";
item.locationInventoryId = ...