- ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
oc继承
一、继承的定义:即指一个对象直接使用另一个对象的属性和方法。
如下图:
基类、父类—————————————>动物
动物的子类,麻雀或金鱼的父类————>鸟或鱼
鸟或鱼的子类、派生类————————>麻雀、黄鹂鸟、鲨鱼、金鱼
二、继承的代码实现
1、基类和派生类之间的关系
派生类方法属性=基类方法属性+派生类自己新增方法和属性
注:1)基类的私有属性能被继承,不能被使用;
2)oc中的继承是单继承:就是一个类只能有一个父类,不能继承多个父类;
3)继承的合理性。
2、方法的重写:从父类继承的方法,可能这个方法并不适合子类,可以在子类中重写父类的方法。
注:1)重写之后,父类的对象调用父类的方法;子类的对象,调用子类的方法,不会引起冲突;
2) 从父类继承的方法,不适用于子类时,可以直接声明父类的同名方法,并定义;不用考虑父类中 方法已存在的问题;
3)重写后,子类可以通过super调用父类的方法。
例:
主函数:
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Bird.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Animal *ani=[Animal new]; //创建animal指针变量ani
ani.name=@"Animal"; //调用animal写入名字
ani.age=99; //调用animal写入年龄
[ani eat]; //调用animal的eat方法
[ani run]; //调用animal的ren方法
NSLog(@"名字:%@\t年龄:%d",ani.name,ani.age); //输出
Bird *bird=[Bird new]; //创建bird指针变量bird
bird.name=@"百灵鸟"; //继承父类animal的方法写入名字
bird.age=5; //继承父类animal的方法写入年龄
NSLog(@"名字:%@\t年龄:%d",bird.name,bird.age); //输出
bird.wing=2; //给bird自身方法赋值
[bird eat]; //调用父类animal的eat方法
[bird run]; //调用父类方法run的重写
[bird fly]; //调用bird自身的方法fly
NSLog(@"%d岁的%@用%d支翅膀在天空飞翔!",bird.age,bird.name,bird.wing);//输出
}
return 0;
}
父类声明:
@interface Animal : NSObject
{ NSString *_name; //定义成员变量name
int _age; //定义成员变量age
}
-(void)setName:(NSString *)name;//name的set方法声明
-(NSString *)name; //name的get方法声明
-(void)setAge:(int)age; //age的set方法声明
-(int)age; //age的get方法声明
-(void)eat;
-(void)run;
@end
父类实现:
#import "Animal.h"
@implementation Animal
-(void)setName:(NSString *)name{ //name的set方法实现
_name=name;}
-(NSString *)name{ //name的get方法实现
return _name;}
-(void)setAge:(int)age{ //age的set方法实现
_age=age;}
-(int)age{ //age的get方法实现
return _age;}
-(void)eat{
NSLog(@"animal在津津有味的吃着!");
}
-(void)run{
NSLog(@"naimal在疯跑!");
}
@end
子类声明:
#import "Animal.h"
@interface Bird : Animal
{ int _wing;
}
-(void)setWing:(int)wing;
-(int)wing;
-(void)eat; //调用父类eat方法
-(void)fly;
-(void)run; //父类方法run的重写
@end
子类实现:
#import "Bird.h"
@implementation Bird
-(void)setWing:(int)wing{
_wing=wing;}
-(int)wing{
return _wing;}
-(void)eat{
[super eat]; //通过super调用父类的方法
}
-(void)fly{
NSLog(@"brid在天空自由的翱翔!");
}
-(void)run{ //父类方法run重写的实现
NSLog(@"brid在疯跑!");
}
@end
3、继承的注意事项
1)子类不能定义和父类同名的变量,但是可以继承父类的变量 ;
2)OC类支持单一继承,不支持多继承
3)OC类支持多层继承
4、继承体系中方法调用的顺序
1)在自己类中找
2)如果没有,去父类中找
3)如果父类中没有,就去父类的父类中
4)如果父类的父类也没有,就还往上找,直到找到基类(NSObject)
5)如果NSObject也没有就报错
- ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------