2009-09-25 45 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