Objective-C语法总结之super

objective-c中super语法与Java中的super类似,都是通过super调用对应的父类方法|构造函数。
通过super可以执行父类中被覆盖的方法,例如以下代码:

父类相关的定义与实现:

* 父类<MyClass>对象定义:
@interface MyClass : NSObject
    @property(nonatomic,retain) NSString * strZhengJieWindowsMyFiles;
    + (void) test;
@end

* 父类<MyClass>对象实现: 
@implementation MyClass
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            NSLog(@"父类的init构造方法");
        }
        return self;
    }
+ (void) test{
    NSLog(@"父类的Test方法");
}
@synthesize strZhengJieWindowsMyFiles;
@end

子类的相关定义与实现:

* 子类<MyChildClass>对象定义:
@interface MyChildClass : MyClass
@end
* 子类<MyChildClass>对象实现:
@implementation MyChildClass
- (instancetype)init
{
    self = [super init];
    if (self) {
        NSLog(@"子类的init构造方法");
    }
    return self;
}
+(void)test{
    [super test];
    NSLog(@"子类的Test方法");
}
@end

在main方法中执行对应的创建和调用:

int main(int argc, const char * argv[]) {
    MyChildClass *myChildClass = [[MyChildClass alloc] init];
    //通过对象获取子类对象,然后执行子类对象的test方法
    [[myChildClass class] test];
    return 0;
}

执行结果:

2018-06-04 11:02:57.537909+0800 TestObjective-C[2240:69324] 父类
2018-06-04 11:02:57.538842+0800 TestObjective-C[2240:69324] 子类
2018-06-04 11:02:57.539241+0800 TestObjective-C[2240:69324] 父类的Test方法
2018-06-04 11:02:57.539559+0800 TestObjective-C[2240:69324] 子类的Test方法
Program ended with exit code: 0

从执行结果中得出结论:
在执行子类的test方法时,如果向super发送调用消息后,会执行对应父类的方法。从代码中得知子类在实例化对象前需要先实例化父类对象。对super发送消息可以调用父类同名的方法。如果父类中没有该声明的方法,则会按照通常的方式在继承链中继续查找对应的消息。

注意: 默认情况下,通过对super发送调用消息需要父类的.h头文件中定义对应的类或对象方法,否则子类无法调用父类的私有方法。

猜你喜欢

转载自blog.csdn.net/u014268482/article/details/80564976