2009-09-25 49 views
2

我想向派生自NSManagedObject的类添加其他行为,并且有4个不同的行为组(现在)。我不需要我的装饰类继承CoreData - 它纯粹是为了添加运行时行为。将装饰器添加到派生自NSManagedObject的类

但是,如果我尝试应用标准Decorator模式,我不能叫“[超级初始化]”,因为你需要插入新的对象进入ManageObjectContext这是有道理的。但我想你会想要在WindowClassScrollDecorator的init中调用[super init],同样,后面的'dealloc'也会调用初始化&正确清理。

我是从“MyWindowClass”类继承,因为我不希望我的客户端类知道亚型,但根据所使用的装饰,行为会有所不同的事情。

那么有什么方法可以解决这个问题?

@interface MyWindowClass : NSManagedObject 
{ 
} 
@end 

@interface WindowClassScrollDecorator: MyWindowClass 
{ 
    MyWindowClass *decoratedClass; 
} 

- (id)initWithMyWindowClass:(MyWindowClass *)aWindowClass; 

@end 

@implementation WindowClassScrollDecorator 

- (id)initWithMyWindowClass:(MyWindowClass *)aWindowClass 
{ 
    // Calling [super init] elicits the following error: 
    // Failed to call designated initializer on NSManagedObject class 'ModelClassScrollDecorator' 
    if (self = [super init])  
    { 
     // do some initialization work here 
     self.decoratedClass = aWindowClass; 
    } 
} 

@end 

回答

1

NSManagedObject S上的生命周期不同于其它对象的位不同;特别是,该对象可能会变成错误(实质上是一个没有设置任何属性的shell对象)而不会被释放。您应该确保知道这些事件,因此您可能需要查看NSManagedObject Class Reference - Subclassing Notes文档。具体而言,您可能需要查看awakeFromInsert:,awakeFromFetch:(will|did)TurnIntoFault。 。

为了解决您的眼前问题,一个NSManagedObject不能没有NSManagedObjectContext创建住。因此,初始化管理对象,则必须调用其指定初始化:

initWithEntity:insertIntoManagedObjectContext: 

你的init方法需要调用该超类的方法,否则你的NSManagedObject将无法​​正常工作。

0

您在这里的问题似乎不是CoreData特有的,但OO设计。

你不应该继承NSManagedObject如果它不是一个NSManagedObject。

你应该让MyWindowClass要么是一个协议,或者具有NSManagedObject类。

+0

我需要“MyWindowClass”是一个NSManagedObject类,我需要在运行时应用的四种不同类型的行为的一个这个类。然后我问的是,你如何应用不同的运行时行为?如果我使用协议,则会有4种不同的协议,但仍然需要一个适用特定协议的中间类。或者这个可以在xcdatamodel类中注释的东西? – 2009-09-25 01:27:18

+0

同样,我会说它应该是一个具有NSManagedObject的类,而不是NSManagedObject。如果装饰器不是一个,那么它不应该继承该类(一直沿着类层次结构)。 你基本上在这里说的是,你想要一些后裔像NSManagedObject和其他人不是。这意味着这些后代应该这样做,而不是基础班。 如果您使用的是协议,那么您将拥有该协议的一个协议和四个实现。那些NSManagedObjects会继承那个类。 – groundhog 2009-09-25 23:25:17