2011-09-22 6 views
10

아래와 같이 ParentChild의 두 클래스가 있습니다. ParentChild의 수퍼 클래스입니다. super 키워드를 사용하여 서브 클래스에서 수퍼 클래스의 메서드를 호출 할 수 있습니다. 수퍼 클래스에서 서브 클래스의 메소드를 호출 할 수 있습니까?슈퍼 클래스에서 서브 클래스의 메소드를 호출하십시오.

Child.h

#import <Foundation/Foundation.h> 
#import "Parent.h" 

@interface Child : Parent { 

} 

- (void) methodOfChild; 

@end 

Child.m

#import "Child.h" 

@implementation Child 

- (void) methodOfChild { 

    NSLog(@"I'm child"); 

} 

@end 

Parent.h :

#import <Foundation/Foundation.h> 

@interface Parent : NSObject { 

} 

- (void) methodOfParent; 

@end 

Parent.m : 응용 프로그램 대리인의하는 .m 파일 헤더에

#import "Parent.h" 

@implementation Parent 

- (void) methodOfParent { 

    //How to call Child's methodOfChild here? 

} 

@end 

가져 오기 "Parent.h".

앱의 대리인의 application:didFinishLaunchingWithOptions: 방법

..

Parent *parent = [ [Parent alloc] init]; 

[parent methodOfParent]; 

[parent release]; 
+7

예, 기술적으로 가능하지만이 디자인의 냄새가납니다. 정말 나빴어. 수퍼 클래스는 서브 클래스에 대해 알지 못합니다. –

+0

신속하고 신속하게 호출 할 때 같은 계층 구조의 메소드를 인식 할 수 없으면 동일한 결과를 얻고 싶습니다. 누구라도 신속한 수업에서 처음으로 전화를 걸 때 똑같이하는 법을 말할 수 있습니까? – NaXir

답변

58

할 수 있습니다, 목표 C 방법 파견 모든 동적 때문이다. [self methodOfChild]으로 전화하면 컴파일러 경고가 발생합니다 (self에서 id으로 캐스팅하여 음소거 할 수 있음).

그러나 선을 사랑하기 때문에하지 마십시오. 부모는 자녀를 제공해야하며 자녀는 부모를 제공하지 않아야합니다. 부모는 하위 클래스의 새로운 메소드에 대해 알고 있으면 커다란 디자인 문제이므로 상속 체인을 잘못 연결하는 강력한 방법을 만듭니다. 부모가 필요로한다면 왜 부모의 방법이 아닌가?

+1

환상적으로 작성되고 정답입니다. 명성! – sosborn

+7

원래 포스터는 C++ 스타일의 추상 기본 클래스 (즉, 메서드를 정의하지만 구현을 제공하지 않음)로 생각할 수 있습니다. 올바른 조언은 부모에게 빈 구현을 제공하여 자식을 무시하도록하는 것입니다. 그게 관련성이있는 경우에만? – Tommy

+0

위대한 정보 주셔서 감사합니다. – Confused

2

super은 "부모 클래스에서 메소드 디스패치"를 의미하므로 서브 클래스에는 하나의 상위 클래스 만 있기 때문에 서브 클래스에는 super을 사용할 수 있습니다. 클래스에는 많은 _sub_classes가있을 수 있으므로 일반적으로 호출 할 메소드 구현을 어떻게 알 수 있습니까? 따라서 sub 키워드와 같은 것이 없습니다.

그러나이 예에서는 두 가지 방법이 있습니다. 당신을 중지 아무것도 없다 (이 같은 작업을 수행하기위한 아주 좋은 이유를이 가정!) 말에서, 부모에

- (void) methodOfParent { 
    [self methodOfChild]; 
} 
+2

대답이 틀리다고 표시하는 것이 도움이됩니다. 그것이 발생하면, 내 것이 아닙니다. obj-c가 동적으로 파견됩니다. '슈퍼'는 "부모의 메소드 사전으로 시작하는 메소드 조회 수행"을 의미하며, 그렇지 않으면 무서운 것처럼 보이는 일을하기에 충분한 이유가 될 수 있습니다. –

6

기술적으로 당신이 그것을 할 수 있습니다. 하지만 디자인을 바꾸는 것이 좋습니다. 프로토콜을 선언하고 하위 클래스가 해당 프로토콜을 채택하도록 할 수 있습니다. 그런 다음 자식이 수퍼 클래스의 해당 프로토콜을 채택하는지 확인하고 수퍼 클래스의 메서드를 호출해야합니다.

+0

귀하의 정보를 보내 주셔서 감사합니다. – Confused

+1

프로토콜을 사용하여 샘플 코드를 제공/공유해주십시오. – Confused

5

이를 사용할 수 있습니다

Parent.m

#import "Parent.h" 

@implementation Parent 

- (void) methodOfChild { 

    // this should be override by child classes 
    NSAssert(NO, @"This is an abstract method and should be overridden");  
} 

@end 

부모가 자녀에 대해 알고 아이가 기능을 구현하는 방법에 대한 선택의 여지가 있습니다.

0

수퍼 여러 잠수정 후 특정 하위의 방법이 하나 갈 경우

if ([super isKindOfClass:[specificsub class]]) { 
       [specificsub methodName]; 
      } 

수퍼 해당 개체 (즉, 하위) 그래서 하위의 방법 을 함께 다루고있다 로그인 한 다른 방법이라고합니다 수퍼 클래스입니다

super *some = [[sub alloc] init]; 
[some methodName]; 
0

하위 클래스의 메소드를 오버라이드하여 수행 할 수 있습니다. 그것은 부모 클래스의 메소드를 만들고 하위 클래스의 메소드를 타는 것입니다.