2009-10-04 2 views
10

두 개의 하위 클래스가 있습니다. 하나는 커스터마이징이 많은 클래스이고 Foo는 하나의 메서드 만 재정의해야하는 다른 하위 클래스이며 다른 하나는 하위 클래스입니다. 추가 변수가 필요 없으면 Bar라고 부릅니다.하나의 .h 및 .m의 Objective-C 다중 클래스 정의

바는 Foo의 변수 중 하나가 될 것이므로, 2 개의 파일 (bar는 .m 및 .h)을 계속 사용하지 않도록하려면 Foo의 .h 및 .m 파일에서 Bar를 구현하고 구현하고 싶습니다. .

최선의 노력으로 여러 가지 컴파일러 오류가 발생합니다. 같은

#import <UIKit/UIKit.h> 

@interface Foo : FooSuperClass { 
    Bar *barVariable; 
} 

@property (nonatomic, retain) Bar *barVariable; 

-(void) fooMethod; 
@end 

@interface Bar : BarSuperClass { 
} 

@end 

하는 .m 파일을 찾습니다 : 같은

.H 파일이 보인다 내가 사물의 유형은 일반적으로 눈살을 찌푸리게 될 것을 깨닫게

#import "Foo.h" 


@implementation Foo 
@synthesize barVariable; 

-(void) fooMethod{ 
    //do foo related things 
} 
@end 

@implementation Bar 
- (void)barSuperClassMethodIWantToOverride{ 
} 
@end 

,하지만 난 그게 적절한 느낀다 내 상황에서. 내가 얻는 첫 번째 오류는 "bar 이전의 예상 지정자 - 한정자 목록"입니다.

내가 잘못 했으므로 하나의 파일에 여러 개의 선언/정의를 가질 수 있다고 확신합니다.

답변

9

헤더에 선언 전에 Bar을 사용했습니다. 해결책 : Foo의 앞에 Bar의 정의를 넣으십시오.

+9

'@ class' 지시어를 사용하는 것이 더 나을 때가 있습니다. 예를 들어, 'Bar'에 선언 된'Foo' 유형의 인스턴스 변수를 가지고 있다면 어떻게 될까요? –

25

컴파일러는 이전에 본 유형의 유효 유형 만 고려합니다. 니콜라이가 언급했듯이 Bar 앞에 Foo을 선언 할 수 있습니다.

그러나 항상 가능한 것은 아닙니다. 다른 상황에서는 @class을 사용하여 클래스를 전달 선언 할 수 있습니다.

e.e.

@class Bar; 
@interface Foo : NSObject 
{ 
    Bar *bar; 
} 
@end 

@class Bar;은 바로 바 포인터라는 이름의 클래스가 유효한 것으로 간주해야이 존재 함을 컴파일러를 알려줍니다.