2010-04-05 2 views
3

죄송합니다. 재 게시가되었지만 몇 마디로 설명 할 수 없어서 검색 할 수 없습니다. 나는 많은 메소드를 가진 수퍼 클래스를 가졌지 만 항상 (전부는 아님) 서브 클래스 화 될 것이다. 슈퍼에서 그 방법을 실행해야합니다. 나도 슈퍼 빈에서 메서드를 남길 수 또는 슈퍼 그냥 그들을 입력 할 수 있지만 어쨌든 그래서 [self myMethod] 같은 호출 할 수 및 내 서브 클래 싱 된 메서드를 호출합니다 경우에도 super에 존재하지 않습니다. 이 작동하지만 Xcode 나에게 오류가 발생합니다. 'superclass' may not respond to '-subclassmethod'어쨌든 서브 클래 싱되는 메소드 (코코아)

경고를 표시하지 않으려면 어떻게해야합니까?

답변

4

는이 같은 슈퍼 클래스에서 구현되지 않은 메소드를 정의하는 것을 선호 : 나는 모든 방법을 정의하지 않은 경우 목표 - C 런타임이 결국 -doesNotRecognizeSelector: 전화 때문에

@interface GLObject : NSObject {} 
- (id)someSubclassProvidedMethod; 
@end 

@implementation GLObject 
- (id)someSubclassProvidedMethod { 
    [self doesNotRecognizeSelector: _cmd]; 
} 
@end 

그것은, 거의 중복입니다. 하지만이를 정의하기 때문에 클래스 인터페이스에있어 컴파일러를 행복하게 유지하고 문서를 제공합니다.

+0

머리글의 메서드를 추상 (오버라이드)으로 문서화하는 것을 잊지 마십시오. –

+0

이것은 훌륭하지만 내 메소드는 void가 아니며 컴파일은 반환 값에 대해 계속 질겁합니다. –

+0

@Michael은'-doesNotRecognizeSelector :'를 호출 한 후 무의미한 값을 반환하거나 메서드를 non-returning로 표시합니다. –

0

요즘이 작업 NSAssert를 사용하여 같은 :

- (BOOL)proceedForVersion:(int)versionInteger 
{ 
    NSAssert(false, @"This method needs to be overridden in a subclass of iMBApertureAbstractParser"); 

    return NO; 
} 
+0

좋은 생각이 있습니다. #define이 유용 할 것입니다. –

1

오히려 슈퍼 클래스보다, 당신이 protocol의 메소드를 선언 할 수있는 어떤 다른 언어의 "인터페이스"라고합니다.

개체가 프로토콜을 준수 함을 선언하도록 변수의 형식 선언을 변경하십시오. 이 MyProtocol를 구현하지 않습니다,하지만 만약 당신이 원하는 것처럼 소리 때문에 당신이 doStuffWith:and:에 슈퍼 클래스의 인스턴스를 통과 할 수 없습니다

-(id)doStuffWith:(SuperClass <MyProtocol> *)aThing and:(id)another { 
    return [aThing myMethodWith:another] 
} 

참고.

1

내 솔루션은 조금 이상한하지만 여기있다 : 클래스가 NSObject에 이미 기재대로

@protocol JSDog <NSObject> 
- (void)yipe; 
@end 

@interface JSDog : NSObject 
@end 

@implementation JSDog 

+ (void)initialize { 
    if ([self isSubclassOfClass:[JSDog class]] && ![self conformsToProtocol:@protocol(JSDog)]) { 
    NSAssert(false, @"Subclasses of JSDog must conform to <JSDog>."); 
    } 
} 

@end 

이름이 같은 프로토콜을 가졌어요. 정식 프로토콜의 메서드는 기본적으로 @required이므로 양쪽에서 보호됩니다. 의 JSDog 하위 클래스가 <JSDog>을 따르 겠지만 -yipe을 구현하지 않으면 오류가 발생합니다. 런타임이 인 경우 하위 클래스가 <JSDog>을 준수하지 않는다면 하위 클래스가 인스턴스화 될 때 경고를 받게됩니다.

+0

분명히 약간 이상합니다. –