例如,假设我有一辆带有以下.h的课车:
Car.h
@interface Car : Automobile
@property Engine * V6;
-(void)igniteEngine:(int) key;
-(void)StopEngine;
@end
现在我有了一个带有.m文件的Car(Test)类别
汽车(试验)的.m
@implementation Car(Test){
Oil * testingOil;
}
...
@end
我希望以下列方式覆盖一个函数
-(void)igniteEngine:(int) key //inside test
{
[self applyTestingOil];
[(reference to original class) igniteEngine:key];
}
我该怎么做呢? 如果有一种不同的方式来解决这个问题也会有所帮助
答案 0 :(得分:1)
覆盖类别中的方法不是一个选项,因为运行时的行为将是未定义的:您无法知道将执行哪个基类或类别实现。
请参阅Avoid Category Method Name Clashes。
如果可能,最简单的方法是对基类进行子类化,并覆盖那里的方法。
子类化不是一个选项,您可以使用method swizzling。这将在运行时与您自己的方法实现交换。 但正如马特所说的那样:" Swizzling被广泛认为是一种伏都教技术"所以如果可以的话,我会避免它。
如果您认为调整可以解决您的问题,并且您已准备好承担风险",请查看JRSwizzle,它将为您处理大部分样板
考虑到你的ivar Oil * testingOil;
,子类化也是唯一的简单选择。正如rmaddy在评论中所说,类别不允许你在课堂上添加ivars。您需要使用Associated Objects。好吧......它不漂亮。