0

B에 하위 클래스 화하여 새 기능으로 수퍼 클래스 A의 메소드를 확장하고자합니다. 인스턴스 변수의 기본값은 @protected이므로 액세스하는 것이 좋습니다. 그러나 A 메서드에서 만든 인스턴스 변수 x에 대한 변경 내용은 B에 반영되지 않으며 그 반대의 경우도 마찬가지입니다.Objective-C 인스턴스 변수의 상속 이해

@interface A : NSObject { 
    X *x; 
} 

- initWithX:(X *)anX; 

@end 

@implementation A 

- initWithX:(X *)anX 
{ 
    assert(anX != nil); 
    if (self = [super init]) { 
     x = anX; 
    } 
    assert(self != nil); 
    return self; 
} 

@end 

@interface B : A 

@end 

@implementation B 

- initWithX:(X *)anX 
{ 
    assert(anX != nil); 
    if (self = [super initWithX:anX]) { 
     assert(x != nil);  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< FAILS 
    } 
    return self; 
} 

@end 

어떻게 AB 사이의 변수 x을 공유 할 수 있습니까?

+1

그런데 프로덕션 코드에는 사용자가 assert()를 사용하지 마십시오. 최소한, NSAssert를 사용하십시오. NSAssert는 디버그에서 어설 션 (assert)까지 컴파일되고 릴리스에서 지워질 것입니다. –

+0

http://www.manicwave.com/blog/2009/10/30/defensive-programming-and-the-role-of-assertions/ – Etan

+0

http://vgable.com/blog/2008/12/04/ nsassert-considered-harmful/ – Etan

답변

3

아직 코드를 확인하십시오. 그리고 다시 한번. 이 코드 이 작동해야합니다. 실제로 ... 상속 된 인터페이스와 부모 인터페이스 간의 기본적인 관계이며 예상대로 작동해야합니다.

샘플에서 제거한 코드의 내용이어야합니다.

+0

고마워요. 실수로'B'에서'x'를 재정의했습니다. * 멍청한 느낌 * – Etan