Как переопределить функцию, которая является частью исходного класса категории?

например, скажем, у меня есть автомобиль класса со следующим .h:

Car.h

@interface Car : Automobile

@property Engine * V6;

-(void)igniteEngine:(int) key;

-(void)StopEngine;

@end

и теперь у меня есть категория Car(Test) с файлом .m

Автомобиль(Тест).m

@implementation Car(Test){
    Oil * testingOil;
}

...

@end

и я хочу переопределить функцию следующим образом

-(void)igniteEngine:(int) key //inside test
{
    [self applyTestingOil];
    [(reference to original class) igniteEngine:key];
}

как бы я это сделал? если есть другой способ приблизиться к этой проблеме, который также был бы полезен


person osebas15    schedule 13.08.2014    source источник
comment
1) Вы не можете добавлять ивары в категорию. 2) Это неопределенное поведение, когда категория переопределяет метод в исходном классе, и нет возможности вызвать исходный переопределенный метод.   -  person rmaddy    schedule 13.08.2014


Ответы (1)


Переопределение метода в категории не является вариантом, так как поведение во время выполнения будет неопределенным: вы не сможете узнать, какая реализация базового класса или категории будет выполнена.

См. Избегайте конфликтов имен методов категорий.

Если возможно, самый простой способ сделать это — создать подкласс базового класса и переопределить в нем метод.

Если создание подклассов невозможно, вы можете использовать метод swizzling. Это заменит реализацию метода на вашу собственную во время выполнения. Но, как выразился Мэтт: «Swizzling широко считается техникой вуду», поэтому я бы избегал этого, если бы мог.

Если вы считаете, что swizzling может решить вашу проблему, и вы готовы «пойти на риск», взгляните на JRSwizzle, который сделает за вас большую часть шаблонного кода.

Учитывая ваш ivar Oil * testingOil;, создание подклассов снова является единственным простым вариантом. Как сказал rmaddy в комментариях, категории не позволяют добавлять ивары в класс. Для этого вам потребуется использовать Associated Objects. Ну и... некрасиво.

person Guillaume Algis    schedule 13.08.2014
comment
спасибо, я иду в подкласс, чтобы все было просто - person osebas15; 13.08.2014