本節學習內容:
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];
}