Object c 继承重写多态
本节学习内容:
1.继承的概念
2.子类重写父类的方法
3.父类指针指向子类对象
4.多态实现
【main.m】
#import<Foundation/Foundation.h>
#import "Student.h"
#import "Teacher.h"
#import "Hander.h"
#import "Rabbit.h"
#import "Cat.h"
#import "Dog.h"
/*重写:子类重新实现从父类继承的方法
//从父类继承的方法不适合子类,子类通常重写父类的方法*/
/*多态:对不同对象,发送相同的消息,有不同的响应*/
int main(int argc,const char*argv[]){
@autoreleasepool{
Student *xiaoming=[[Student alloc]init];
xiaoming.name=@"小明";
xiaoming.age=12;
xiaoming.num=10;
xiaoming.score=99;
[xiaomeng printInfomation];
/*打印结果:
重写前 name=小明 age=12
重写后 name=小明 age=12 num=10 score=99
*/
//NSLog 自动调用descripion方法
NSLog(@"%@',xiaoming);
/*打印结果:重写前 name=xioaming age=12
重写后 name=小明 age=12 num=10 score=99
*/
//先从了类对象中查找方法的实例,如果子类中没有实现对应的方法,则到父类中查询方法的实现
Teacher *MrWang=[[Teacher alloc]init];
MrWang.name=@"王老师";
MrWang.age=30;
MrWang.place=@‘上海浦东’;
MrWang.weight=70
NSLog(@"%@",MrWang);
/*打印结果:name=王老师 age=30 place=上海浦东 weight=70.*/
//将xiaoming对像保存在Person对像指针中
Person *per=XiaoMing;
//仍是调用的Student类的description方法
//父类的指针可以指向子类的对象,调用的方法实现,根据对象本身类型决定
NSLog(@"per----%@",XiaoMeing);
/*打印结果:per--- name=小明 age=12 num=10 score=99*/
per=MrWang;
NSLog(@"per----%@",MrWang);
/*打印结果:per--- name=小明 age=12 num=10 score=99*/
//多态
Rabbit *rabbit=[[Rabbit alloc]init];
Cat *xiaoTom=[[Cat alloc]init];
Dog *xiaobai=[Dog allock]init];
Hander *xiaoHua=[[Hander alloc]init];
[xiaoHua askAnimalFood:rabbit];
/*打印结果: 类名:rabbit
rabbit like to eat carberage!!
*/
[xiaoHua askAnimalFood:xiaoTom];
/*打印结果: 类名:Cat
cat like to eat fish!!
*/
[xiaoHua askAnimalFood:xiaobai];
/*打印结果: 类名:Dog
Dog like to eat bone!!
*/
}
return 0;
}
【person.h】
#import<Foundation/Foundation.h
@interface Person:NSObject{
NSString *_name;
NSIneter _age;
}
@property(nonatomic,copy) NSString *name;
@roperty(nonatomic,assign) NSInteger age;
-(voidPprintInfomation;
@end
【person.m】
#import"person.h"
@implementation Person
-(void)printInfomation{
NSLog(@"name=%@ age=%li",_name,_age);
}
//描述类的实例的方法
-(NSString *)description
{
//返回一个字符串
return[NSString stringWithFormat:@"name=%@ age=%li',_name,_age];]
}
@end
【Student.h]
#import"Person.h"
//student类继承Person类
@interface Student:Person{
NSInteger _num;//编号
NSInteger _score;//分数
}
@property(nonatomic,assign)NSInteger num;
@property(nonatomic,assign) NSInteger scorel;
@end
【Student.m]
//在子类中重写父类继承过来的方法,不需求在子类继续声明
-(void)printInfomation{
NSLog(@"name=%@ age=%li num=%li score=%li',_name,_age,_num,_score);
}
//重写description
-(NSString *)description
{
//返回一个字符串
return[NSString stringWithFormat:@"name=%@ age=%li,num=%li,socre=%li',_name,_age,_num,_score];]
}
@end
【Teacher.h】
#import"Person.h"
@interface Teacher:Person{
NSString *_place;//工作地点
float _weight;
}
@property(nonatomic, copy)NSStrig *place;
@property(nonatomic, copy)NSInteger weight;
@end
【Teacher.m】
#import "Teacher.h'
@implementation Teacher
-(NSString *)description{
return[NSString stringWithFormat:@"name=%@ age=@li place=%@ weight=%.2f", _name, _age, _place, _weight];
}
【Animal.h】
#import<Foundation/Foundation.h>
@interface Animal : NSObject
-(void)showAnimalFood;
【Animal.m】
#implementation Animal
-(void)showAnimalFood{
NSLog(@"类名:%@',[self class]);//class获取对象所在的类名;
NSLog(@"---------------------------------------');
}
@end
【Dog.h】
//继承anmial类
【Dog.m】
#import"Dog.h"
@implementation Dog
//重写showAnimalFood
-(void)showAnimalFood{
NSLog(@"类名:%@",[self class]);
NSLog(@"Dog like to eat bone!!“);
}
【Cat.h】
//继承anmial类
【Cat.m】
#import"Cat.h"
-(void)showAnimalFood{
NSLog(@"类名:%@",[self class]);
NSLog(@"cat like to eat fish!!“);
}
【Rabbiit.h】
//继承anmial类
【Rabbit.m】
#import"Rabbit.h"
-(void)showAnimalFood{
NSLog(@"类名:%@",[self class]);
NSLog(@"cat like to eat carberage!!“);
}
【Handder.h】
#import<Fondation/Foundation.h>
@interface Handder: NSObject
-(void)askAnimalFood:(Animal *)ani;
@end
【Handder.m】
#import "Habder"
-(void)askAnimalFood:(Animal*)ani{
[ani showAnimalFood];
}