Наследование Objective-C; вызывать переопределенный метод из суперкласса? - PullRequest
6 голосов
/ 26 декабря 2010

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

@interface BaseClass
- (id)overrideMe;
- (void)doAwesomeThings;
@end

@implementation BaseClass
- (id)overrideMe {
    [self doesNotRecognizeSelector:_cmd];
    return nil;
}
- (void)doAwesomeThings {
    id stuff = [self overrideMe];
    /* do stuff */
}
@end

@interface SubClass : BaseClass
@end

@implementation SubClass
- (id)overrideMe {
    /* Actually do things */
    return <something>;
}
@end

Однако, когда я создаю SubClass и пытаюсь его использовать, он все равно вызывает overrideMe на BaseClass и вылетает из-за doesNotRecognizeSelector:.(Я не делаю [super overrideMe] или что-то еще глупое).

Есть ли способ заставить BaseClass вызвать переопределенный overrideMe?

Ответы [ 2 ]

2 голосов
/ 26 декабря 2010

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

Из вашего описания я бы сказал, что либо экземпляр, которым вы отправляете сообщения, не тот класс, о котором вы думаете, или вы допустили опечатку в своем коде при объявлении имен методов.ваше приложение под GDB, добавьте символьную точку останова на objc_exception_throw, воспроизведите вашу проблему.Как только ваш процесс остановился на исключении "didNotRecognizeSelector", напечатайте описание объекта и его класс.

Или зарегистрируйте его перед вызовом -overrideMe:

NSLog (@ "объект:% @ class:% @", obj, [obj class])

0 голосов
/ 26 декабря 2010

Запись категории для BaseClass для переопределения метода.

@interface BaseClass (MyCategory)
- (id) overrideMe;
@end

@implementation BaseClass (MyCategory)
- (id) overrideMe
{
    /* Actually do things */    
    return <something>;
}

@end

Теперь все экземпляры BaseClass будут отвечать селектору overrideMe с новой реализацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...