我想知道是否可以访问在父类中声明的方法,该方法已被覆盖(如果我犯了任何错误,对不起我的英语)。代码段:
#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”将显示在屏幕上。
谢谢。
答案 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;
}