强制子类在Objective-C中调用其超类方法

Ide*_*per 4 inheritance overriding objective-c compiler-warnings

我有两个班,VehicleCar; Car是.的子类Vehicle.

有一种方法logVehicleDetailVehicle类.

有什么办法可以在重写这个方法时强制Car调用它的超类logVehicleDetail方法吗?如果子类不这样做,那么编译器应该生成警告或错误.

例如,在没有ARC的情况下进行编译时,编译器会[super dealloc]在您自己调用时发出警告dealloc.

Ker*_*rrM 8

有很多方法可以做到这一点.也许最简单,最直接的方法是添加__attribute__((objc_requires_super))到方法声明中:

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

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

实现类似结果的另一种方法是为记录细节的车辆创建协议,例如

@protocol VehicleLogger <NSObject>

-(void)logDetails;

@end
Run Code Online (Sandbox Code Playgroud)

在您的Vehicle头文件中.然后,在Vehicle要记录详细信息的每个子类中,使其符合该协议.

@implementation Car <VehicleLogger>
Run Code Online (Sandbox Code Playgroud)

这样,您将在编译器中收到警告以实现该方法.在实现中,您可以调用以下super的实现logDetails:

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

另一方面,如果你想要的是每个子类调用Vehicle的实现,那么就不要在子类中实现该方法.