【问题标题】:Forcing a subclass to call its superclass method in Objective-C在 Objective-C 中强制子类调用其超类方法
【发布时间】:2014-12-05 09:34:22
【问题描述】:

我有两个班,@​​987654321@ 和 Car; Car 是 Vehicle 的子类。

Vehicle 类中有一个方法logVehicleDetail。

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

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

【问题讨论】:

  • 让我看看我是否明白了:你希望Vehicle 的子类始终调用Vehicle 的logVehicleDetail 实现?
  • 没错,这就是我想要的。

标签: objective-c inheritance compiler-warnings overriding


【解决方案1】:

有多种方法可以做到这一点。也许最简单直接的方法是将__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对logDetails的实现:

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

另一方面,如果您只想让每个子类调用Vehicle 的实现,那么就不要在子类中实现该方法。

【讨论】:

  • 这个我知道,但我不想用这个。您会看到 Apple 实施了这种类型的限制。在非arc环境下如果不调用[super dealloc]就会有警告。
  • 在这种情况下,您可以使用 __attribute__((objc_requires_super)) - 查看我的编辑
  • Foundation.framework 有一个名为 NS_REQUIRES_SUPER 的宏来替换 __attribute__((objc_requires_super))。
【解决方案2】:
- (void)logVehicleDetail {
[super logVehicleDetail];
// extra implementation
}

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

【讨论】:

  • 我希望如果子类没有调用 [super logVehicleDetail] 那么应该有一个编译时错误或警告。
猜你喜欢
  • 2011-12-21
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多