我有两个班级,Vehicle
和Car
; Car
是Vehicle
的子类。
logVehicleDetail
类中有一个方法Vehicle
。
有什么办法可以强制Car
在覆盖此方法时调用其超类方法logVehicleDetail
?如果子类不这样做,那么编译器应该生成警告或错误。
例如,在没有ARC的情况下进行编译时,如果您不在自己的[super dealloc]
中调用dealloc
,编译器会发出警告。
答案 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
}
这就是你需要的吗?或者你的意思是你想要强制执行它而不必发送超级消息?