目标 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(任何实现&lt;UITableViewDatasource&gt; 所需方法的元素)来请求做某事。然后,您可以让两个对象使用同一个类作为数据源,并且实现将被共享。

【讨论】:

感谢您的回复,但是您没有调整继承问题.. 如果 ManagedPerson 和 NonManagedPerson 对 doSomthing 方法有相同的实现呢? 我可以举个例子吗?在这些情况下,代表团的组成可能会对您有所帮助 在我的例子中,ManagedPerson 和 NonManagedPerson 有一些分片实现,这就是为什么我让它们从实现分片方法的父对象继承。仅使用接口的问题是我将不得不在它们中复制相同的实现。 Composition 将创建第三个类,称为 MyPersonImplementation,将所有共享实现放在那里,然后给每个***类一个 MyPerson 类型的 ivar,然后他们可以转发方法调用在 PersonInterface 中。另一种选择是使共享实现只是一堆 C 函数,并让每个***类的方法调用 C 函数。有很多关于对象组合的文献,比如:en.wikipedia.org/wiki/Object_composition

以上是关于目标 c - 制作从同一个父类继承的 NSManagedObject 和常规 NSObject 类的主要内容,如果未能解决你的问题,请参考以下文章

C#-面向对象的三大特性——继承

继承简介

类的继承

Java 继承

java 类的继承,子类变量的获取

Java继承