在我的iPhone应用程序中,我有两个viewControllers: viewController1有一个tableView,它显示了Item1对象的列表 viewController2有一个tableView,它显示了Item2对象的列表
其中Item1类和Item2类继承自抽象类ParentItem。
现在我想让Item2对象成为NSManagedObject,这样我就可以将它保存在设备上,并使viewController2使用NSFetchedResultsController来加载带有Item2对象的tableView。
但我不希望Item1成为NSManagedObject,我想将它用作常规对象。
问题是,如果我创建ParentItem类作为NSManagedObject,那么Item1类也将是一个NSManagedObject,我不能将它用作常规对象(我的意思是我不能用常规的alloc-init创建一个Item1对象,或者我可以???)
如果我将ParentItem类创建为常规NSObject,那么Item2类也将是常规NSObject。
答案 0 :(得分:9)
您最需要的是两个类可以实现的接口。我将使用一个人的例子:
@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>
所需方法的元素)来要求完成某些事情。然后,您可以让两个对象使用相同的类作为数据源,并且将共享实现。