2013-02-25 2 views
0

Objective-C의 추상 클래스와 비슷한 것을 구현하는 방법을 찾는 데 어려움이 있습니다.부모로부터 자식 오버라이드 된 메소드 호출하기

하위 클래스를 지정하지 않고 기본 클래스를 사용하도록 제한하는 것에 대해 실제로 신경 쓰지 않습니다. 원하는 모든 것 : - (void)makeRequest과 같은 메서드가있는 클래스 A (부모/기본/추상)를 갖고 싶습니다. 클래스 B, C, D 등에서 클래스를 서브 클래스 화하고 클래스 'A 메소드에서 호출되고있는 - (id)getCachedResult과 같은 메소드가 있습니다. 그래서 기본적으로 클래스 A에서 기본 논리를 구현하기를 원하며이 기본 논리의 일부 세부 사항과 부분을 수정하기위한 하위 클래스가 필요합니다.

퀴즈처럼 들리지만 Objective-C에서 그런 패턴을 구현하는 방법에 손가락을 대지 못했습니다.

UPDATE :

@interface A : NSObject 

- (void)makeRequest; 
- (NSString *)resultKey; 

@property (strong) NSMutableDictionary * result; 

@end 

@implementation A 

- (void)makeRequest 
{ 
    self.result[self.resultKey] = @"Result"; 
} 

- (NSString *)resultKey 
{ 
    @throw [NSException exceptionWithName:NSInternalInconsistencyException 
            reason:[NSString stringWithFormat:@"%@ should be overrided in subclass", NSStringFromSelector(_cmd)] 
           userInfo:nil]; 
    return nil; 
} 

@end 

///////////////////////////// 

@interface B : A 

@end 

@implementation B 

- (NSString *)resultKey 
{ 
    return @"key"; 
} 

@end 

을 내가 클래스 B의 인스턴스를 만드는거야 언제는 방법 나는 예외를 받고 있어요 - (void)makeRequest의 호출을 시도, 그리고 그 :

여기

내가 할 노력하고있어입니다 꽤 분명하다. 내가 원하는 것은 동일한 목적을 위해 클래스를 올바르게 디자인하는 방법입니다.

+0

그것은 다소 사소한 것입니다. 서브 클래 싱의 기본 개념입니다. 당신의 문제는 어디에 정확하게 있습니까? 코드의 구체적인 예를 제시하고 문제를 설명해야합니다. 당신이 everythnig 권리를 할 때 - 그리고 실수를하는 많은 기회가 없다 - 그때 그것은 단지 당신이 그것을 묘사하는 방식으로 작동합니다. –

+0

@HermannKlecker, Ok, 어디서 문제가 발생했는지 구체적으로 질문을 업데이트하겠습니다. – DemoniacDeath

+1

B의 인터페이스에서'resultKey'를 선언해야합니다. – Matthias

답변

0

요청에 따라 : resultKey을 B 인터페이스에 선언해야합니다. :-)

+0

스타일의 문제로, 아마도. 그러나 인터페이스의 메소드 선언은 런타임 동작에 영향을 미치지 않습니다. 이 점을 고쳐 주든간에. –

+0

@ChrisDevereux : 나는 동의하지 않는다. 런타임에 메시지는 요청 된 ** selector ** (메소드가 아님)를 사용하여 "가장 낮은"(클래스 계층 구조에서) 객체로 전송됩니다. 컴파일러는 인터페이스에서 선택기를 생성합니다. 런타임에도 수행 할 수 있지만 명시 적으로 수행해야합니다. OP의 질문의 경우, 클래스 B의 선택자를 알 수 없으므로 수퍼 클래스의 메서드가 호출됩니다. – Matthias

+0

https://developer.apple.com/library/mac/ipad/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtHowMessagingWorks.html –

관련 문제