2012-08-05 4 views
2

는 전 클래스가하위 클래스와 속성이 할당

@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

+0

그것은 ** 하나를 필요로하는 것이 아니라 그 존재를 명시한 원래 상황을 수용하는 것의 문제입니다. 클래스에 초기화 자 하나만 있으면된다는 요구 사항은 없습니다. –

+0

물론 두 개 이상의 초기화 프로그램을 가질 수 있습니다. 하지만 나는 오히려 BasicDescription 객체에서 propertys를 설정하기 위해 helper 메소드 (init로 시작하지 않는 메소드)를 사용하려고합니다. – Moxy

관련 문제