新建Person 、Student 和 LanOuStudent三个类,其中 Student类 继承 Person类 ,LanOuStudent类继承Student类
Person.h 文件:
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name; // 姓名
NSString *_gender; // 性别
NSString *_age; // 年龄
}
// 自定义初始化方法
- (instancetype)initWithName:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age;
+ (instancetype)personWithName:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age;
// set get 方法
- (void)setName:(NSString *)name;
- (NSString *)name;
- (void)setGender:(NSString *)gender;
- (NSString *)gender;
- (void)setAge:(NSString *)age;
- (NSString *)age;
// sayHi方法(介绍自己)
- (void)sayHi;
@end
Person.m文件:
#import "Person.h"
@implementation Person
// 自定义初始化方法
- (instancetype)initWithName:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age
{
self = [super init];
if (self) {
_name = name;
_gender = gender;
_age = age;
}
return self;
}
+ (instancetype)personWithName:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age
{
Person *p = [Person personWithName:name Gender:gender Age:age];
return p;
}
// set get 方法
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
- (void)setGender:(NSString *)gender
{
_gender = gender;
}
- (NSString *)gender
{
return _gender;
}
- (void)setAge:(NSString *)age
{
_age = age;
}
- (NSString *)age
{
return _age;
}
// sayHi方法(介绍自己)
- (void)sayHi
{
NSLog(@"姓名:%@ 性别:%@ 年龄:%@",_name, _gender, _age);
}
@end
Student.h文件:
#import "Person.h"
@interface Student : Person
{
NSString *_number; // 学号
}
// 自定义初始化方法
- (instancetype)initWithName:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age
Number:(NSString *)number;
+(instancetype)student:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age
Number:(NSString *)number;
// get set 方法
- (void)setNumber:(NSString *)number;
- (NSString *)number;
- (void)sayHiStudent;
@end
Student.m文件:
#import "Student.h"
@implementation Student
- (instancetype)initWithName:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age
Number:(NSString *)number
{
// 继承中的自定义初始化方法
// 赋值实例变量的时候 需要 先判断一下继承是否成功
// 也就是调用父类的初始化方法
self = [super initWithName:name Gender:gender Age:age];
if (self) {
// 如果继承成功的话就继续初始化子类中特有的实例变量
_number = number;
}
// 继承失败 直接返回就行
return self;
}
+(instancetype)student:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age
Number:(NSString *)number
{
Student *stu = [Student student:name Gender:gender Age:age Number:number];
return stu;
}
- (void)setNumber:(NSString *)number
{
_number = number;
}
- (NSString *)number
{
return _number;
}
- (void)hahaha
{
// 在本类中可以使用关键字 self 当作本类对象 来调用本类的方法
NSLog(@"hahaha");
}
- (void)sayHiStudent
{
// 调用这个方法 打印全部信息
// 先去调用 父类方法 sayHi 然后再打印学号 输入完整信息
// [self hahaha];
// super是一个 编译器指令 可以通过该指令直接跳过本类的方法 直接去调用父类的方法(上一级的父类)
[super sayHi];
NSLog(@"%@", _number);
}
@end
LanOuStudent.h文件:
#import "Student.h"
@interface LanOuStudent : Student
{
NSString *_jianChi;
}
- (instancetype)initWithName:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age
Number:(NSString *)number
Jianchi:(NSString *)jianchi;
// 添加一个类方法 初始化一个对象
// 便利构造器方法
+ (instancetype)lanouStudentWithName:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age
Number:(NSString *)number
Jianchi:(NSString *)jianchi;
@end
LanOuStudent.m文件:
#import "LanOuStudent.h"
@implementation LanOuStudent
- (instancetype)initWithName:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age
Number:(NSString *)number
Jianchi:(NSString *)jianchi
{
self = [super initWithName:name Gender:gender Age:age Number:number];
if (self) {
_jianChi = jianchi;
}
return self;
}
+ (id)lanouStudentWithName:(NSString *)name
Gender:(NSString *)gender
Age:(NSString *)age
Number:(NSString *)number
Jianchi:(NSString *)jianchi
{
// 初始化对象 并返回
LanOuStudent *stu = [[LanOuStudent alloc]initWithName:name Gender:gender Age:age Number:number Jianchi:jianchi];
return stu;
}
@end
main.m文件:
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
#import "LanOuStudent.h"
int main(int argc, const char * argv[]) {
/*
继承的特性:
1.继承是单向的(从上到下)
2.继承是可传递的
3.不能相互继承
4.不能多继承
5.继承 就是 子类继承父类所有的 实例变量和方法
继承的好处:
减少代码量 提高工作效率
*/
// 创建人类
// 学生类 继承人类
// 蓝鸥学生类 继承学生类
Person *person = [[Person alloc]initWithName:@"Q" Gender:@"女" Age:@"22"];
[person sayHi];
Student *stu = [[Student alloc]init];
// 学生类中本没有init方法 该方法是从基类中继承过来的
// 通过set方法赋值
// 学生类本没有name这个实例变量 和set方法 现在使用的都是从父类Person类中继承下来的
[stu setName:@"A"];
[stu setGender:@"女"];
[stu setAge:@"23"];
[stu setNumber:@"1111"];
[stu sayHiStudent];
// 创建蓝鸥学生对象
LanOuStudent *lanou = [[LanOuStudent alloc]init];
[lanou setName:@"W"];
[lanou setGender:@"男"];
[lanou setAge:@"24"];
[lanou setNumber:@"1234"];
// 继承中方法的调用
// 使用self调用方法的时候
// 优先调用本类中的方法 没有继续查找上一级
// 找到就调用 没有就继续查找 都没有 崩溃
// 使用super调用方法的时候
// 直接跳过本类去查找上一级的父类
// 找到就调用 没有就继续查找 都没有 崩溃
// super没有特殊的意义 就是一个 编译器指令
// 使用类方法初始化一个对象 在lanoustudent中
LanOuStudent *l = [LanOuStudent lanouStudentWithName:@"S" Gender:@"男" Age:@"25" Number:@"456" Jianchi:@"坚持"];
[l sayHiStudent];
Person *p = [Person personWithName:@"X" Gender:@"女" Age:@"26"];
[p sayHi];
return 0;
}