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

时间:2014-12-05 09:34:23

标签: objective-c inheritance compiler-warnings method-overriding

我有两个班级,VehicleCar; CarVehicle的子类。

logVehicleDetail类中有一个方法Vehicle

有什么办法可以强制Car在覆盖此方法时调用其超类方法logVehicleDetail?如果子类不这样做,那么编译器应该生成警告或错误。

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

2 个答案:

答案 0 :(得分: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

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

@protocol VehicleLogger <NSObject>

-(void)logDetails;

@end

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

@implementation Car <VehicleLogger>

这样,您将在编译器中收到警告以实现该方法。在实施过程中,您可以调用super的{​​{1}}

的实施方式
logDetails

另一方面,如果你想要的是每个子类都要调用-(void)logDetails { [super logDetails]; //Do more stuff here, if I want } 的实现,那么就不要在子类中实现该方法。

答案 1 :(得分:0)

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

这就是你需要的吗?或者你的意思是你想要强制执行它而不必发送超级消息?