如何覆盖作为类别原始类的一部分的函数?

时间:2014-08-13 17:32:05

标签: objective-c polymorphism override objective-c-category class-hierarchy

例如,假设我有一辆带有以下.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];
}

我该怎么做呢? 如果有一种不同的方式来解决这个问题也会有所帮助

1 个答案:

答案 0 :(得分:1)

覆盖类别中的方法不是一个选项,因为运行时的行为将是未定义的:您无法知道将执行哪个基类或类别实现。

请参阅Avoid Category Method Name Clashes

如果可能,最简单的方法是对基类进行子类化,并覆盖那里的方法。

子类化不是一个选项,您可以使用method swizzling。这将在运行时与您自己的方法实现交换。 但正如马特所说的那样:" Swizzling被广泛认为是一种伏都教技术"所以如果可以的话,我会避免它。

如果您认为调整可以解决您的问题,并且您已准备好承担风险",请查看JRSwizzle,它将为您处理大部分样板

考虑到你的ivar Oil * testingOil;,子类化也是唯一的简单选择。正如rmaddy在评论中所说,类别不允许你在课堂上添加ivars。您需要使用Associated Objects。好吧......它不漂亮。