将装饰器添加到从NSManagedObject派生的类中

时间:2009-09-25 01:01:48

标签: iphone objective-c oop core-data

我想为从NSManagedObject派生的类添加额外的行为,并且有4个不同的(现在)行为组。我不需要使用CoreData持久化我的装饰器类 - 它纯粹是为了添加运行时行为。

但是,如果我尝试应用标准的Decorator模式,我就不能调用'[super init]',这是有道理的,因为你需要将新对象插入到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

2 个答案:

答案 0 :(得分:1)

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

要解决您的直接问题,在没有NSManagedObject的情况下无法创建NSManagedObjectContext。因此,要初始化托管对象,您必须调用其指定的初始化程序:

initWithEntity:insertIntoManagedObjectContext:

您的init方法需要在超类上调用该方法,否则您的NSManagedObject将无效。

答案 1 :(得分:0)

你在这里的问题似乎不是CoreData特定的,而是OO设计。

如果NSManagedObject不是NSManagedObject,则不应该继承NSManagedObject。

您应该使MyWindowClass成为协议或具有NSManagedObject的类。