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

标签 ios core-data inheritance nsmanagedobject

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

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

最佳答案

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

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

InventoryItem *item = ...

FavoriteInventoryItem *item = ...

你会说:

id < InventoryItem > item = ...

我正在重复名称,因为我不知道什么是更好的名称,但协议(protocol)定义为:

@protocol InventoryItem < NSObject >

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

@end

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

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

关于ios - 需要继承 NSManagedObject 的自定义类的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17027930/

相关文章:

inheritance - 为什么 Dart 不继承构造函数?

ios - 带有 xcode 6.1 的 Pods 共享工具包

ios - 当我点击 MapKit 中的图钉时如何执行操作? ios9, swift 2

objective-c - 核心数据中关系的默认值

ios - 核心数据 : Unable to load class for entity

python - PySide多重继承: Inheriting a QWidget and a Mixin

Java 继承 - 使用相同方法的两个类

iphone - UITextView 文本颜色自动变得与背景颜色相同

ios - initWithCoder : and initWithFrame: 之间共享初始化方法的命名约定

ios - Keypath not found in entity error 但我可以插入到数据存储中