我的iOS学习历程 - OC第三天
今天主要讲的是OC继承的使用 创建一个父类 使用其相同的属性来创建子类 子类继承任何父类的属性和方法(点击打开链接 附带一个例题,名字为继承类)
#import<Foundation/Foundation.h>
#import"Person.h"
#import"Student.h"
#import"LStudent.h"
int main(int argc,constchar * argv[]) {
继承的:特性
1.继承是单向的(从上到下)
2.继承是可传递的
3.不能相互继承
4.不能多继承
5.继承就是子类继承父类的所有实例变量和方法
继承的:好处
1.减少代码量提高工作效率
创建人类
学生类继承人类
L学生类 继承学生类
// 创建一个对象 Person *p1 = [[Person alloc]initWithName:@"小明" gander:@"男" age:@"18"]; [p1 sayHi]; // 创建一个学生 Student *s1 = [[Studentalloc]init]; // 学生类中本没有init方法该方法是从基类中继承过来的 // 通过set方法赋值 // 学生类本没有 name这个实例变量和 set方法现在使用的都是从父类(Person)中继承下来的 [s1 setName:@"亚索"]; [s1 setAge:@"18"]; [s1 setGander:@"男"]; [s1 sayHi]; // 给学生加一个学号 [s1 setNumber:@"1"]; [s1 sayHiStudernt];</span>
3.继承中方法的调用
1.使用self调用方法的时候
优先调用本类中的方法没有继续查找上一级,找到就调用,没有就继续查找都没有就崩溃
2.使用super调用方法的时候
直接跳过本类去查找上一级的父类,找到就调用没有就继续查找都没有就崩溃
super没有一个特殊的意思就是一个编译器指令
***************************************************************************************
(peson,h)
#import <Foundation/Foundation.h> @interfacePerson :NSObject { NSString *_name; // 姓名 NSString *_gander; // 性别 NSString *_age; // 年龄 } // 自定义初始化方法 // set get 方法 // sayHi方法(介绍自己) -(instancetype)initWithName:(NSString *)name gander:(NSString *)gander age:(NSString *)age; // 名字的set,get方法 -(NSString *)name; -(void)setName:(NSString *)name; // 性别的set,get方法 -(NSString *)gander; -(void)setGander:(NSString *)gander; // 年龄的set,get方法 -(NSString *)age; -(void)setAge:(NSString *)age; // 自我介绍 -(void)sayHi; @end
(person,m)
<span style="font-size:18px;">#import "Person.h" @implementation Person -(instancetype)initWithName:(NSString *)name gander:(NSString *)gander age:(NSString *)age{ self = [superinit]; if (self) { _name = name; _gander = gander; _age = age; } returnself; } // 名字的set,get方法 -(NSString *)name{ return_name; } -(void)setName:(NSString *)name{ _name = name; } // 性别的set,get方法 -(NSString *)gander{ return_gander; } -(void)setGander:(NSString *)gander{ _gander = gander; } // 年龄的set,get方法 -(NSString *)age{ return_age; } -(void)setAge:(NSString *)age{ _age = age; } // 自我介绍 -(void)sayHi{ NSLog(@"我的名字叫%@性别%@今年%@岁",_name,_gander,_age); } @end</span>
***************************************************************************************
(Student .h)
<span style="font-size:18px;">#import "Person.h" @interface Student :Person { NSString *_number; } // 自定义初始化 -(instancetype)initWithName:(NSString *)name gander:(NSString *)gander age:(NSString *)age number:(NSString *)number; // 遍历构造器 +(instancetype)studentWithName:(NSString *)name gander:(NSString *)gander age:(NSString *)age number:(NSString *)number; // number set,get方法 -(NSString *)number; -(void)setNumber:(NSString *)number; // 自我介绍 -(void)sayHiStudernt;</span>
(Student.m)
<span style="font-size:18px;">#import "Student.h" @implementation Student // 自定义初始化 -(instancetype)initWithName:(NSString *)name gander:(NSString *)gander age:(NSString *)age number:(NSString *)number{ // 继承中的自定义初始化方法 // 赋值实例变量的时候需要先判断一下继承是否成功 // 也就是调用父类的初始化方法 self = [superinitWithName:namegander:ganderage:age]; if (self){ // 如果继承成功的话就继续初始化子类中特有的实例变量 _number = number; } // 继承失败直接返回就行 returnself; } // 遍历构造器 +(instancetype)studentWithName:(NSString *)name gander:(NSString *)gander age:(NSString *)age number:(NSString *)number{ Student *stu = [[Studentalloc]initWithName:namegander:ganderage:agenumber:number]; return stu; } // number set,get方法 -(NSString *)number{ return_number; } -(void)setNumber:(NSString *)number{ _number = number; }</span>
在本类中可以使用关键字self当作本类对象来调用本类中方法(self的调用方法是先从本类中找方法,如果本类中找不到,就去父类找,就这样循环,一直找到基类,找不到就崩溃)
// 自我介绍 -(void)sayHiStudernt{ // 调用这个方法打印全部信息 // 先去调用父类的方法 sayHi然后在打印学好输入完整信息 [supersayHi]; // super是一个编译器指令可以通过该指令直接跳过本类的方法直接去调用父类的方法(上一级的父类) NSLog(@"%@",_number); }
@end