4

두 클래스, VehicleCar; CarVehicle의 하위 클래스입니다.하위 클래스가 Objective-C에서 수퍼 클래스 메서드를 호출하도록 강요합니다.

클래스에 logVehicleDetail 메서드가 있습니다.

Car은이 메서드를 재정의 할 때 수퍼 클래스 메서드 logVehicleDetail을 호출 할 수있는 방법이 있습니까? 서브 클래스가 그렇게하지 않는 경우, 컴파일러는 경고 또는 에러를 생성 할 필요가 있습니다.

예를 들어 ARC없이 컴파일 할 때 컴파일러는 dealloc[super dealloc]을 호출하지 않으면 경고 메시지를 표시합니다.

+0

만약 내가 이것을 얻었 으면하자 : 당신은'Vehicle'의 서브 클래스가 항상'Vehicle'의'logVehicleDetail' 구현을 호출하기를 원합니 까? – KerrM

+0

바로 그게 내가 원하는 것. – Ideveloper

답변

8

이렇게하는 방법에는 여러 가지가 있습니다.

@interface Vehicle : NSObject 
    -(void)logDetails __attribute__((objc_requires_super)); 
@end 

@implementation Car 
    -(void) logDetails { 
} // WARNING: Method possibly missing a [super logDetails] call 

예를 들어, 세부 사항을 기록 차량에 대한 프로토콜을 작성하는 것입니다 유사한 결과를 달성하기위한 다른 방법 : 아마도 가장 쉽고 간단한 방법은 메서드 선언에 __attribute__((objc_requires_super))를 추가하는 것입니다

@protocol VehicleLogger <NSObject> 

-(void)logDetails; 

@end 

Vehicle 헤더 파일에 있습니다. 그런 다음 세부 정보를 기록하려는 Vehicle의 모든 하위 클래스에서 해당 프로토콜을 준수하는지 확인하십시오.

@implementation Car <VehicleLogger> 

그런 식으로 컴파일러에서 해당 메소드를 구현하는 경고 메시지가 표시됩니다. 의 구현, 다음 단순히에서 그 방법을 구현하지 않는 : 그리고 구현에 당신은 super '반면에 당신이 원하는 모든 Vehicle를 호출하는 모든 서브 클래스 인 경우

-(void)logDetails { 
    [super logDetails]; 
    //Do more stuff here, if I want 
} 

logDetails의의 구현'호출 할 수 있습니다 아강.

+0

이것은 알고 있지만 이것을 사용하고 싶지 않습니다. Apple은 이러한 유형의 제한을 적용합니다. 아크가없는 환경에서 [super dealloc]을 호출하지 않으면 경고가 표시됩니다. – Ideveloper

+1

그런 경우 __attribute __ ((objc_requires_super))를 사용할 수 있습니다 - 내 편집 참조 – KerrM

0
- (void)logVehicleDetail { 
[super logVehicleDetail]; 
// extra implementation 
} 

그게 필요한가요? 아니면 수퍼 메시지를 보내지 않고도 시행하고 싶습니까?

+0

하위 클래스가 [super logVehicleDetail]을 호출하지 않으면 컴파일 시간 오류 또는 경고가 발생합니다. – Ideveloper

관련 문제