// 第三章 继承、初始化方法、便利构造器
// 一、面向对象的三大特性; 1.封装 2.继承 3.多态
// 1.一个类之中有多个属性、方法, 把这些成员封装在一个类中, 把这个类当做一个整体来用
// 首先,实例变量一定不能被@public修饰,因为一旦被@public修饰,就能在外界通过对象名来访问这个实例变量,随意修改实例变量的值。然后给实例变量提供两种方法来供外界为实例变量赋值和访问,也就是setter和getter方法。
// 2. 继承 将相同的特征和行为写进父类, 子类中只需要写自己独有的特征以及行为, 技能保证子类的完整, 又能简化代码
//父类和子类只是相对的概念, 继承的上层叫父类, 继承的下层叫子类, 并不是所有的类都有父类, 没有父类的类叫做根类, OC里面的根类是 NSObject
// 1)main 文件
Person *per1 = [[Person alloc] init];
[per1 setName:@"沈佳宜"];
[per1 setGender:@"女"];
[per1 setAge:18];
[per1 introduceSelf];
Student *stu1 = [[Student alloc] init];
[stu1 setName:@"林允儿"];
[stu1 setGender:@"女"];
[stu1 setAge:25];
//[stu1 setNumber:33];
//[stu1 setScore:100];
[stu1 set_number:22];
[stu1 set_score:100];
// 2).h文件
// 本类的类名 : 父类的类名
@interface Person : NSObject
{
NSString *_name;
NSString *_gender;
NSInteger _age;
}
// 3).m文件
//如果对继承父类的方法不满意,可以重写(overwrite)
-(void)introduceSelf{
//编译器指令 ,而不是对象 ,super 执行父类中的方法
[super introduceSelf];
// NSLog(@"我叫 %@ %@ ,今年 %ld 岁, 学号 %ld ,成绩 %.1f",_name, _gender, _age, _number, _score);
NSLog(@"学号 %ld 成绩 %.1f",_number, _score);
}
//3.多态:
// 第一种体现 不同对象对同一个消息可以有不同的实现
[stu1 introduceSelf];
CollegeStudent *coStu1 = [CollegeStudent alloc];
[coStu1 setName:@"何以琛"];
[coStu1 setGender:@"男"];
[coStu1 setAge:21];
[coStu1 set_score:90];
[coStu1 set_number:38];
[coStu1 setMajor:@"计算机软件"];
[coStu1 setAcademy:@"计算机学院"];
[coStu1 introduceSelf];
CollegeStudent *coStu2 = [CollegeStudent alloc];
[coStu2 setName:@"赵默笙"];
//第二种体现 父类指针可以指向子类对象
// coStu1 fallInLoveWith:(Person *)
[coStu1 fallInLoveWith:coStu2];
Person *per2 = [[CollegeStudent alloc] init];
//编译时,编译器会将coStu3看做是大学生对象;运行时,coStu3是Person类型的
// CollegeStudent *coStu3 = [[Person alloc] init];
// [coStu3 fallInLoveWith:per1];
// 二、初始化方法
//初始化方法在对象的生命周期中只使用一次
Person *per = [[Person alloc]initWithName:@"TokyoHot" gender:@"unkown" age:10];
Student *stu = [[Student alloc]initWithName:@"iPindo" gender:@"famale" age:5 number:007 score:100];
CollegeStudent *col = [[CollegeStudent alloc]initWithName:@"何以琛" gender:@"男" age:21 number:9 score:90 major:@"计算机编程算法" academy:@"计算机"];
[col introduceSelf];
//初始化方法的实现
-(instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age number:(NSInteger)number score:(float)score{
//对继承值父类的实例变量进行初始化
self = [super initWithName:name gender:gender age:age];//必须初始化
//判断如果self不为空,初始化自身的实例变量
if (self != nil) {
_number = number;
_score = score;
}
return self;
}
// 三、便利构造器(工厂方法)
Person *per = [Person personWithName:@"郭富城" gender:@"男" age:50];
Student *stu = [Student studentWithName:@"Yoona" gender:@"女" age:25 number:1 score:100];
//内部实现
+(instancetype)studentWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age number:(NSInteger)number score:(float)score{
//在类方法中,代表当前类
Student *stu = [[Student alloc]initWithName:name gender:gender age:age number:number score:score];
return stu;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交