如何访问父类中声明的方法?

时间:2011-02-21 07:50:28

标签: objective-c inheritance methods override parent

我想知道是否可以访问在父类中声明的方法,该方法已被覆盖(如果我犯了任何错误,对不起我的英语)。代码段:

#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;
}

所以我的问题是,当Parent *指针指向Child对象时,如何调用父类中定义的'message'方法。 Objective-C(纯动态语言)自动调用Child的方法,但是可以通过* p指针从外部调用父类的方法吗?我的意思是,当我将消息'message'发送到'p'时,不是“Child”,而是“Parent”将显示在屏幕上。

谢谢。

2 个答案:

答案 0 :(得分:3)

将子messgae方法修改为

-(void) message
{
    [super message];
    printf("\nChild\n");
}

答案 1 :(得分:2)

经过几天的学习后,我找到了解决方案。此解决方案通过函数指针显式调用该方法,而不是发送消息。我知道这不是一个好习惯,但我认为有些情况需要申请。所以代码:

#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;
}