2012-08-05 167 views
2

我有一個類:子類和屬性賦值

@interface BasicDescription : NSObject 

@property (strong,nonatomic) NSString *author; 
@property (assign,nonatomic) NSInteger year; 
@property (strong,nonatomic) NSString *owner; 

,二類:

@interface AdvDescModel : BasicDescription 

-(id)initWithBasicModel:(BasicDescription*)basicModel; 

所以我的問題是如何分配的所有屬性,當我創建新的對象。現在我有

AdvDescModel *adv = [AdvDescModel alloc] initWithBasicModel:basic]; 

然後在初始化:

-(id)initWithBasicModel:(BasicDescription*)basicModel { 

    if(self = [super init]) { 
     [self setAllParams:basicModel]; 
    } 
    return self; 
} 

-(void)setAllParams:(BasicDescription*)bModel { 

    [self setAuthor:bModel.author]; 
    [self setYear:bModel.year]; 
    [self setOwner:bModel.owner]; 
} 

但有沒有更好的辦法來做到這一點?現在我必須觀看我所有的屬性併爲每一個屬性調用setter。

回答

4

初始化對象的方式並不差,如果滿足您的要求,您可以以這種方式離開......但是看看Builder Pattern這將是在這種情況下最好的選擇。

0

假設你有很多這樣的屬性,更好的方法是使用一個帶有所有默認值的可變字典,並簡單地在每個新對象上設置它。然後,您可以修改子類或用戶想要更改的值。

0

我認爲這是更好的做法有負責其自己的屬性一類,所以我會建議,AdvDescModel有初始值,如...

-(id)initWithBasicModel:(BasicDescription*)basicModel { 

    if(self = [super initWithBasicModel:basicModel]) { 
     ; // Anything specific to the subclass 
    } 
    return self; 
} 

...和家長有:

-(id)initWithBasicModel:(BasicDescription*)bModel { 

    if(self = [super init]) { 
     [self setAuthor:bModel.author]; 
     [self setYear:bModel.year]; 
     [self setOwner:bModel.owner]; 
    } 
    return self; 
} 
+0

你不應該需要一個「準備好」的BasicDescription對象來初始化一個新的分配的! – Moxy 2012-08-05 16:17:22

+0

這不是**需要**的問題,而是適應指定存在的原始情況。沒有要求只有一個類的初始化器。 – 2012-08-05 16:22:13

+0

當然,你可以有多個初始化程序。但我寧願使用一個輔助方法(不是以init開頭的方法)來設置BasicDescription對象的屬性。 – Moxy 2012-08-05 16:52:18