多态的条件
有继承关系,有方法重写,父类声明变量指向子类对象
多态的概念
不同的对象以自己的方式响应父类的同名方法
体现:用父类类型的指针指向子类对象,如下多态性
狗 *g = [狗 new];
动物 * a= [狗 new];
猫 *c = [猫 new];
动物 * a= [猫 new];
多态的优点
多态的主要好处就是简化了编程接口,容许类和类之间重用一些习惯性的命名,
多态的实现
父类Animal.h
#import<Foundation/Foundation.h>
//声明父类对象
@interface Animal :NSObect
-(void)run;
@end
父类Animal.m
#import”Animal.h”
//实现父类对象
@implementation Animal
-(void)run
{
NSLog(@“动物在跑”);
}
@end
子类狗类Dog.h
#import<Foundation/Foundation.h>
#import”Animal.h”
//声明狗类对象
@interface Dog :Animal
-(void)run; //此话可写可不写,因为父类有
-(void)eat;
@end
子类Dog.m
#import”Dog.h”
//实现子类对象
@implementation Dog
-(void)run
{
NSLog(@“狗在跑”);
}
-(void)eat
{
NSLog(@“狗在吃东西”);
}
@end
子类猫类Dog.h
#import<Foundation/Foundation.h>
#import”Animal.h”
//声明狗类对象
@interface Cat :Animal
-(void)run; //此话可写可不写,因为父类有
@end
子类Cat.m
#import”Cat.h”
//实现子类对象
@implementation Cat
-(void)run
{
NSLog(@“猫在跑”);
}
@end
测试main函数
#import <Foundation/Foundation.h>
#import”DOg.h”
#import “Cat.h”
int main(int argc,const char * argv[])
{
@autoreleasepool{
//*******不使用多态的形式*******
Animal *ani = [Animal new];
[ani run]; //动物在跑
Dog *d = [Dog new];
[d run]; //狗在跑
Cat *c = [Cat new];
[c run]; //猫在跑
//*******使用多态的形式*******
//父类指针指向了子类的对象
Animal *a2 = [Dog new];
[a2 run];
}
}
多态原理
动态绑定:及动态类型能使程序知道执行时才确定对象所属类型
动态类型绑定能使程序知道执行时才确定要对对象调用的实际方法,
Animal *a2 = [Dog new];//执行到这句话的时候才能确定是调用的事Dog类
[a2 run];
多态的注意点
1)如果存在多态,父类是可以访问子类特有的方法
Animal *a2 = [Dog new]; //a2属于Animal类型,指向Dog对象,a2没有eat方法
[a2 eat];(编译的时候会报错)
[(Dog *)a2 eat]; //狗在吃东西,可以将a2强制转化为Dog类型
2)如果不存在堕胎,父类事不可以访问子类特有方法的
|
|