继承就是父类与子类的关系,在oc中一切的类都是NSObject的子类,父类有的方法,子类没有必要在声明,可以直接使用,如果不对方法重新实现,子类在调用该方法的时候,将完全实现父类的功能。
// 子类一定比父类的能力更强大
// 通常用父类指针指向子类是可以的,相当于把能力少的来使用,相反就不可以了,下面我们就以几个类为例子来说明这一系列问题,来建立一个人类,在建立两个类(分别是老师和学生),两都是人的子类。
#import <Foundation/Foundation.h>
#import "HHStudent.h"
#import "HHTeacher.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
#if 0
// 子类一定比父类的能力更强大
// 通常用父类指针指向子类是可以的,相当于把能力少的来使用
HHPerson *student = [HHStudent studentWithName:@"奈何桥" age:@(18) grade:@"primary"];
[student play:@"LOL"];
[student eat:@"appple"];
//父类中没有学习方法,要使用(父类的指针指向子类的方法)要使用以下方法解决问题
// 用选择器
if ([student respondsToSelector:@selector(study:)]) {
[student performSelector:@selector(study:) withObject:@"Engliash"];
}
// 强制类型转换
[(HHStudent *)student study:@"Engliash"];
HHPerson *teacher = [HHTeacher teacherWithName:@"李老师"age:@(30) professionalTitle:@"教授"];
// 下面的代码编译不会出问题,运行时会崩溃
// [(HHTeacher *)student teach:@"math"];
[teacher play:@"basketball"];
[teacher eat:@"banana"];
[(HHTeacher *)teacher teach:@"生理学"];
#endif
HHPerson *p1 = [HHTeacher teacherWithName:@"张三" age:@(30) professionalTitle:@"讲师"];
HHPerson *p2 = [HHStudent studentWithName:@"李韦" age:@(20) grade:@"大一"];
HHPerson *p3 = [HHStudent studentWithName:@"张伟" age:@(50) grade:@"大三"];
NSArray *person = @[p1,p2,p3];
for (HHPerson *temperson in person) {
[temperson eat:@"吃西餐"];
[temperson play:@"麻将"];
// 运行时类型识别(RTTI)
if ([temperson isKindOfClass:[HHStudent class]]) {
// 强制类型转
[(HHStudent *)temperson study:@"oc语言"];
}
else if ([temperson isKindOfClass:[HHTeacher class]]){
[(HHTeacher *)temperson teach:@"JSON数据解析"];
}
}
}
return 0;
}
#import <Foundation/Foundation.h>
/**
* 人类
*/
@interface HHPerson : NSObject
/**
* 姓名
*/
@property (nonatomic,copy) NSString *name;
/**
* 年龄
*/
@property (nonatomic,strong) NSNumber *age;
/**
* 吃东西
*
* @param foodName 东西的名字
*/
- (void)eat:(NSString *)foodName;
/**
* 玩游戏
*
* @param gaemeName 游戏名字
*/
- (void)play:(NSString *)gaemeName;
/**
* 初始化方法
*
* @param name 姓名
* @param age 年龄
*
* @return 返回一个具体的人
*/
- (instancetype)initWithName:(NSString *) name age:(NSNumber *) age;
@end
#import "HHPerson.h"
@implementation HHPerson
- (instancetype)initWithName:(NSString *)name age:(NSNumber *)age{
if (self = [super init]) {
_name = name;
_age = age;
}
return self;
}
- (void)eat:(NSString *)foodName{
NSLog(@"年龄为%@名字为%@正在吃%@",_age,_name,foodName);
}
- (void)play:(NSString *)gaemeName{
NSLog(@"年龄为%@名字为%@正在玩%@",_age,_name,gaemeName);
}
@end
/**
* 老师类
*/
@interface HHTeacher : HHPerson
/**
* 职称
*/
@property (nonatomic,copy) NSString *professionalTitle;
/**
* 学习
*
* @param courseName 课程名字
*/
- (void)teach:(NSString *)professionalTitle;
/**
* 初始化方法
*
* @param name 姓名
* @param age 年龄
* @param grade 年级
*
* @return 返回对象
*/
+ (instancetype) teacherWithName:(NSString *)name
age:(NSNumber *) age
professionalTitle:(NSString *) professionalTitle;
@end
@implementation HHTeacher
/**
* 私有的方法
*
* @param name 学生姓名
* @param age 年龄
* @param professionalTitle 职称
*
* @return 初始化
*/
- (instancetype)initWithName:(NSString *)name age:(NSNumber *) age professionalTitle:(NSString *) professionalTitle{
if (self = [super initWithName:name age:age]) {
professionalTitle= professionalTitle;
}
return self;
}
+ (instancetype)teacherWithName:(NSString *)name age:(NSNumber *)age professionalTitle:(NSString *)professionalTitle{
return [[self alloc] initWithName:name age:age professionalTitle:professionalTitle];
}
- (void)teach:(NSString *)courseName{
NSLog(@"%@正在上%@课",self.name,courseName);
}
@end
#import <Foundation/Foundation.h>
#import "HHPerson.h"
/**
* 学生类
*/
@interface HHStudent : HHPerson
@property (nonatomic,copy) NSString *grade;
/**
* 学习
*
* @param courseName 课程名字
*/
- (void)study:(NSString *)courseName;
/**
* 初始化方法
*
* @param name 姓名
* @param age 年龄
* @param grade 年级
*
* @return 返回对象
*/
+ (instancetype) studentWithName:(NSString *)name
age:(NSNumber *) age
grade:(NSString *) grade;
@end
#import "HHStudent.h"
@implementation HHStudent
/**
* 私有的方法
*
* @param name 学生姓名
* @param age 年龄
* @param grade 年级
*
* @return 初始化
*/
- (instancetype)initWithName:(NSString *)name age:(NSNumber *) age grade:(NSString *) grade{
//父类的方法初始化
if (self = [super initWithName:name age:age]) {
_grade = grade;
}
return self;
}
+ (instancetype)studentWithName:(NSString *)name age:(NSNumber *)age grade:(NSString *)grade{
return [[self alloc] initWithName:name age:age grade:grade];
}
- (void)study:(NSString *)courseName{
NSLog(@"年级为%@年龄为%@名字为%@的学生正在努力学习%@",_grade,self.age,self.name,courseName);
}
@end
原文:http://www.cnblogs.com/yuanwang942217/p/4977391.html