【问题标题】:How to override a function that is part of a category's original class?如何覆盖属于类别原始类的函数?
【发布时间】:2014-08-13 17:32:04
【问题描述】:

例如,假设我有一辆带有以下 .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) 您不能将 ivars 添加到类别中。 2) 当一个类别覆盖原始类中的方法并且无法调用原始覆盖的方法时,这是未定义的行为。

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


【解决方案1】:

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

Avoid Category Method Name Clashes

如果可能,最简单的方法是继承基类,并覆盖那里的方法。

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

如果您认为 swizzling 可以解决您的问题,并且准备好“冒险”,请查看 JRSwizzle,它将为您处理大部分样板文件。

考虑到您的 ivar Oil * testingOil;,子类化再次成为唯一简单的选择。正如 rmaddy 在 cmets 中所说,类别不允许您将 ivars 添加到类中。为此,您需要使用 Associated Objects。嗯......它不漂亮。

【讨论】:

  • 谢谢你,我要去子类保持简单
猜你喜欢
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
相关资源
最近更新 更多