目标 c - 制作从同一个父类继承的 NSManagedObject 和常规 NSObject 类
Posted
技术标签:
【中文标题】目标 c - 制作从同一个父类继承的 NSManagedObject 和常规 NSObject 类【英文标题】:objective c - making a NSManagedObject and regular NSObject classes that inherit from the same parent class 【发布时间】:2012-01-15 12:37:18 【问题描述】:在我的 iPhone 应用程序中,我有两个视图控制器: viewController1 有一个 tableView 显示 Item1 对象的列表 viewController2 有一个 tableView 显示 Item2 对象的列表
其中Item1类和Item2类继承自抽象类ParentItem。
现在我想让 Item2 对象成为 NSManagedObject,这样我就可以将它保存在设备上,并让 viewController2 使用 NSFetchedResultsController 来加载它的 tableView 和 Item2 对象。
但我不希望 Item1 成为 NSManagedObject,我想将其用作常规对象。
问题是,如果我将 ParentItem 类创建为 NSManagedObject,那么 Item1 类也将是 NSManagedObject 并且我不能将它用作常规对象(我的意思是我将无法使用常规 alloc-init 创建 Item1 对象,或者我可以吗???)
如果我将 ParentItem 类创建为常规 NSObject,那么 Item2 类也将是常规 NSObject。
【问题讨论】:
你需要一些共享的实现,还是只是一个共享的接口?对于共享接口,您可以只使用协议。 我也需要共享实现 【参考方案1】:您最需要的是两个类可以实现的接口。我会用一个人的例子:
@protocol PersonInterface <NSObject>
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
@end
类继承自NSObject
@interface NonManagedPerson : NSObject <PersonInterface>
@end
@implementation NonManagedPerson
@synthesize firstName = _firstName;
@synthesize lastName = _lastName;
@end
类继承自NSManagedObject
@interface ManagedPerson : NSManagedObject <PersonInterface>
@end
@implementation ManagedPerson
@dynamic firstName;
@dynamic lastName;
@end
现在,如果一个对象需要使用这些类中的任何一个,它并不关心它的超类型,它只关心对象响应-firstName
、-lastName
、-setFirstName
或-setLastName
。
为了实现这种灵活性,您需要确保要使用的对象符合接口,因为您不再担心特定类型,例如:
@interface FootballClub : NSObject
@property (nonatomic, retain) id<PersonInterface> clubManager;
// .. other properties
@end
更新
要获得共享实现,您可以考虑组合/委托。
作曲
您创建另一个类来封装常见工作,然后将其作为 ivar 用于您的类中。
代表团
与其他常见元素一样,例如UITableView
。在某些时候,它会调用它的datasource
(任何实现<UITableViewDatasource>
所需方法的元素)来请求做某事。然后,您可以让两个对象使用同一个类作为数据源,并且实现将被共享。
【讨论】:
感谢您的回复,但是您没有调整继承问题.. 如果 ManagedPerson 和 NonManagedPerson 对 doSomthing 方法有相同的实现呢? 我可以举个例子吗?在这些情况下,代表团的组成可能会对您有所帮助 在我的例子中,ManagedPerson 和 NonManagedPerson 有一些分片实现,这就是为什么我让它们从实现分片方法的父对象继承。仅使用接口的问题是我将不得不在它们中复制相同的实现。 Composition 将创建第三个类,称为 MyPersonImplementation,将所有共享实现放在那里,然后给每个***类一个 MyPerson 类型的 ivar,然后他们可以转发方法调用在 PersonInterface 中。另一种选择是使共享实现只是一堆 C 函数,并让每个***类的方法调用 C 函数。有很多关于对象组合的文献,比如:en.wikipedia.org/wiki/Object_composition以上是关于目标 c - 制作从同一个父类继承的 NSManagedObject 和常规 NSObject 类的主要内容,如果未能解决你的问题,请参考以下文章