oc——类的继承
🎇继承是面向对象的三大特征之一,在了解类的继承之前我们要先理解一下什么是父类,对于oc来说,每一个子类只有一个直接父类,通俗点讲,如果把人类看作一个父类,那么学生就是人类的一个子类,人类能干的事情学生一定也能干,但是学生能干的事情人类并不一定能干,首先我们来看一个例子。
我们首先来写一个Person类:
//Person.h
@interface Person : NSObject
- (void) Work;
@end
//person.m
#import <Foundation/Foundation.h>
#import "Person.h"
@implementation Person
- (void) Work {
NSLog(@"workevery");
}
@end
然后我们来写一个Student类,它的父类是Person类。
// Student.h
#import "Person.h"
@interface Student : Person
//- (void) Work;//首先不对它声明任何方法
@end
#import <Foundation/Foundation.h>
#import "Student.h"
@implementation Student
/*- (void) Work { //同样也不定义
NSLog(@"play");
}*/
@end
然后我们在主函数里来试试:
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main (int argc, char * argv[]) {
@autoreleasepool {
Person * xiaoming = [[Person alloc] init];//首先定义一个Person类的xiaoming
[xiaoming Work];//让小明运行Work方法
Student * xiaohong = [[Student alloc] init];//再定义一个Student类的xiao'hong
[xiaohong Work];//同样让小红运行Work方法
}
}
🎇我们可以发现xiaohong完全可以运行Work这个方法,因此可证明子类的变量可以直接运行父类的方法;但是如果子类中有和父类相同的方法我们该怎么办?
我们来给Student类上加上Work方法
// Student.h
#import "Person.h"
@interface Student : Person
- (void) Work;
@end
// Student.m
#import <Foundation/Foundation.h>
#import "Student.h"
@implementation Student
- (void) Work {
NSLog(@"play");
}
@end
main函数不变,我们来看运行结果:
super关键字
🎇xiaohong先运行了Student里的方法,到了这里,我们面临一个问题,如果小红想运行Person里的Work怎么办?
这时候就要用到了一个新的关键字super,super用于在子类中调用父类中被覆盖的实例方法。
我们在代码中加上super关键字
// Student.m
#import <Foundation/Foundation.h>
#import "Student.h"
@implementation Student
- (void) Work {
[super Work];
NSLog(@"play");
}
@end
然后我们来看运行结果:
xiaohong既运行了父类中的Work方法,又运行了子类中的Work方法。
✨需要注意的一点:
super是Objective-c提供的一个关键字,super用于限定该对象调用它从父类继承得到的属性和方法。
正如self不能出现在类方法中一样,super也不能出现在类方法中。类方法的调用者只能是类本身,而不是对象,因而super关键字也就失去了意义。