一、目标
1、掌握面向对象编程特性——继承
2、掌握OC中的自定义初始化方法
3、掌握OC中的便利构造器的写法
二、Objective-C
1、OC中,一个类可以继承另外一个类
2、被继承的类称为父类(super class)或超类
3、继承的类称为子类(subclass)
4、子类可以直接使用父类的部分特征和行为
注意:OC中只允许每个类有切只有一个父类,并且OC种的基类时NSObject!!!
5、实现继承很简单:在封装类的接口部分使用符号“:”
@interface childClass: superClass{
}
例如:
@interface Person: NSObject{
}
6、下面创建一个学生类:
Student.h
#import "Person.h"
@interface Student : Person{
int number;//学号
float score;//分数
}
- (void)study;
@end
Student继承于Person类,除了包含自身特征和行为外,还包含父类的特征和行为!!
三、继承
1、子类能直接继承父类的方法
2、还可以重写父类的方法(子类自己实现行为)
3、子类重写了父类的方法,调用过程中执行子类的方法
4、继承具有传递性:如果A是B的子类,B是C的子类,那么A也具有C的特性和行为
四、方法
1、在OC语言里,方法分两大类:类(+)方法和实例(-)方法:
类方法必须用类(名)来调用,实例方法必须用对象来调用
方法是类的行为,在接口文件中声明,在实现文件中实现。
例如:
setter、getter都是OC中的方法
除了上一篇定义的那些方法,OC中同样有多参方法
(1)子类调用父类的方法,新建一个Student继承Person
Student.h
#import "Person.h"
@interface Student : Person
@end
Student.m
#import "Student.h"
@implementation Student
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
//实例化Student类的实例对象
Student *student = [[Student alloc]init];
[student setName:@"Jack"];
[student sayHi];
return 0;
}
(2)重写父类的方法,重写父类的方法不需要再次声明
Student.h
#import "Person.h"
@interface Student : Person
@end
Student.m
#import "Student.h"
@implementation Student
- (void)sayHi{
NSLog(@"学生的姓名是%@",name);
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
//实例化Student类的实例对象
Student *student = [[Student alloc]init];
[student setName:@"Jack"];
[student sayHi];
return 0;
}
2、自定义初始化方法
(1)创建对象分两步:分配空间和初始化
(2)初始化方法的作用就是为对象赋初始值
(3)初始化方法通常以init开头
例如:
- (id)initWithName:(NSString *)name;
注意:一个类可以包含多个初始化方法!!
3、self、super
self和super是OC语言中的关键字:
super:将消息发送给父类对象
self:将消息发送给本对象
self始终代表接收消息的对象
4、指定初始化方法
一个类有且只有一个指定初始化方法,在众多的初始化方法中,无论你调用哪个初始化方法,指定初始化方法都会执行,指定初始化方法会跟父类初始化方法有一定联系。
5、便利构造器
便利构造器是一种快速创建对象的方式。它本质上是把初始化方法做了一次封装,方便外界使用。
便利构造器是一个类方法。(以+开头)
<span style="font-size:14px;">+(UIButton *)buttonWithType(UIButton Type)buttonType;</span>
6、事例:为Student类添加自定义初始化方法、为Student类添加指定初始化方法、为Student类添加便利构造器方法
Student.h
#import "Person.h"
@interface Student : Person{
//学号
NSInteger number;
//分数
CGFloat score;
}
//指定初始化方法,通常情况下是能够赋初始值最多的方法
- (id)initWithName:(NSString *)_name
Age:(NSInteger)_age
Gender:(NSString *)_gender
Number:(NSInteger)_number
Score:(CGFloat)_score;
//自定义初始化方法
- (id)initWithName:(NSString *)_name;
- (id)initWithNumber:(NSInteger)_number;
//便利构造器
+ (id)studentWithName:(NSString *)_name;
+ (id)studentWithNumber:(NSInteger)_number;
+ (id)studentWithName:(NSString *)_name
Age:(NSInteger)_age
Gender:(NSString *)_gender
Number:(NSInteger)_number
Score:(CGFloat)_score;
//自定义初始化方法
//指定初始化方法
//便利构造器
@end
Student.m
#import "Student.h"
@implementation Student
//指定初始化方法,通常情况下是能够赋初始值最多的方法
- (id)initWithName:(NSString *)_name
Age:(NSInteger)_age
Gender:(NSString *)_gender
Number:(NSInteger)_number
Score:(CGFloat)_score{
//self 指的就是将消息发送给本对象
//super 指的就是将消息发送给父类对象
self = [super init];//[super init]就是将消息init发送给学生类的父类Person进行执行
if(self != nil){
name = _name;
age = _age;
gender = _gender;
number = _number;
score = _score;
}
return self;
}
//自定义初始化方法
- (id)initWithName:(NSString *)_name{
return [self initWithName:_name Age:0 Gender:nil Number:0 Score:0.0f];
}
- (id)initWithNumber:(NSInteger)_number{
return [self initWithName:nil Age:0 Gender:nil Number:_number Score:0.0f];
}
//便利构造器
+ (id)studentWithName:(NSString *)_name{
Student *student = [[Student alloc]initWithName:_name];
return student;
}
+ (id)studentWithNumber:(NSInteger)_number{
Student *student = [[Student alloc]initWithNumber:_number];
return student;
}
+ (id)studentWithName:(NSString *)_name
Age:(NSInteger)_age
Gender:(NSString *)_gender
Number:(NSInteger)_number
Score:(CGFloat)_score{
Student *student = [[Student alloc]initWithName:_name
Age:_age Gender:_gender Number:_number Score:_score];
return student;
}
- (void)sayHi{
NSLog(@"学生的姓名是%@",name);
}
@end
mian.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
//实例化Student类的实例对象
Student *student = [[Student alloc]init];
[student setName:@"Jack"];
[student sayHi];
//通过便利构造器创建实例对象
Student *autoStudent = [Student studentWithName:@"xiaoa"];
[autoStudent sayHi];
return 0;
}
五、总结
1、OC只允许单继承,继承具有传递性。2、子类从父类继承了部分特征和行为。
3、子类可以重写父类方法,定制自己个性化的行为。
4、OC中的方法:类方法和实例方法。
5、OC中的实例化方法:自定义初始化方法和便利构造器。