Как получить доступ к методу, объявленному в родительском классе? - PullRequest
3 голосов
/ 21 февраля 2011

Интересно, возможно ли получить доступ к методу, объявленному в родительском классе, который был переопределен (извините за мой английский, если я сделаю какие-либо ошибки). Фрагмент кода:

#import <stdio.h>
#import <objc/Object.h>

@interface Parent : Object
-(void) message;
@end

@implementation Parent
-(void) message
{
    printf("\nParent\n");
}
@end

@interface Child : Parent
//-(void) message;
@end

@implementation Child
-(void) message
{
    printf("\nChild\n");
}
@end

int main(int argc, const char* argv[])
{
    Parent* p = [[Child alloc] init];

    [p message];

    [p free];
    return 0;
}

Итак, мой вопрос, как я могу вызвать метод 'message', определенный в родительском классе, когда указатель Parent * указывает на дочерний объект. Objective-C (будучи чисто динамическим языком) автоматически вызывает метод Child, но возможно ли вызвать метод родительского класса извне, через указатель * p? Я имею в виду, что когда я отправляю сообщение «message» на «p», на экране будет отображаться не «Child», а «Parent».

Спасибо.

Ответы [ 3 ]

3 голосов
/ 21 февраля 2011

Изменить дочерний messgae метод как,

-(void) message
{
    [super message];
    printf("\nChild\n");
}
2 голосов
/ 01 марта 2011

После нескольких дней изучения цели-c я нашел решение.Это решение явно вызывает метод через указатель на функцию вместо отправки сообщения.Я знаю, что это не очень хорошая практика, однако я думаю, что бывают ситуации, когда это необходимо применять.Итак, код:

#import <stdio.h>
#import <stdlib.h>
#import <Foundation/Foundation.h>

@interface Parent : NSObject     // I switched from Object to NSObject
-(void) message;
@end

@implementation Parent
-(void) message
{
    printf("\nParent\n");
}
@end

@interface Child : Parent
-(void) message;
@end

@implementation Child
-(void) message
{
    printf("\nChild\n");
}
@end

int main(int argc, const char* argv[])
{
    IMP f;
    Parent* p = [[Child alloc] init];  //p could be (Child*) too
    f = [[p superclass] instanceMethodForSelector: @selector(message)];
    f(p, @selector(message));

    [p release];
    return EXIT_SUCCESS;
}
0 голосов
/ 10 сентября 2015

В категории вашего подкласса напишите что-то вроде этого:

-(void)callSuperMessage
{
[super message];
}
...