需要继承 NSManagedObject 的自定义类的子类

Posted

技术标签:

【中文标题】需要继承 NSManagedObject 的自定义类的子类【英文标题】:Subclass of custom class that needs to subclass NSManagedObject 【发布时间】:2013-06-10 15:51:43 【问题描述】:

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

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

【问题讨论】:

您只是想整合这些属性,还是有一些功能(方法)与之配套?如果只是这些参数,你只会让自己过得很艰难。这些类可能看起来很相似,但它们的继承表明它们是完全不同的。合并这些类的继承实际上会给您带来什么好处? @Wain 我已经更新了问题以更好地定义我正在尝试做的事情。这些对象在整个代码库中都使用,并且由于这种情况存在大量重复代码。没有与任何一个类相关的方法。 那么,重复代码不在这些类中,而是在使用它们的类中?你能使用协议来指定类之间的共同点,并允许使用的代码对协议是通用的吗? @Wain 请原谅我的无知。我不确定我是否理解协议的实现如何帮助我解决特定问题。您能在答案中发布某种示例吗? 【参考方案1】:

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

协议的规范是重要的部分,实现已经存在于您拥有的 2 个类中。规范将列出 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 = ...

【讨论】:

非常感谢。这似乎是处理这种情况的最佳方式。现在是实施重构的时候了。 :)

以上是关于需要继承 NSManagedObject 的自定义类的子类的主要内容,如果未能解决你的问题,请参考以下文章

Swift:CoreData NSManagedObject 的自定义设置器

NSManagedObject 子类的自定义初始化

NSManagedObject 子类中的自定义设置器

TableView 的自定义复选框给出 NSManagedObject 错误

你能从继承普通表单的自定义表单继承吗

NSManagedObject 验证和子类