——- ios培训、ios培训、期待与您交流! ———-
什么是多态
多态:是指一种事物的多种形态.
代码体现: 父类的指针指向子类的对象
Dog *d=[Dog new];//普通写法
Animal *a=[Dog new];//多态写法
多态有什么作用?
具有极强的扩展性.父类的一个指针可以表示不同的子类为对象.
Animal *a=[Dog new];//a指向Dog对象
Animal *a=[Cat new];//a也可以指向Cat对象
多态有什么局限?
父类的指针指向子类时,如果要调用子类的独有方法,必须强转.
代码体现
代码中的注释会详细解释多态的每一个特点
#import <Foundation/Foundation.h>
//父类--动物
@interface Animal : NSObject{
char *_name;
}
-(void)setName:(char *)name;
-(char *)getName;
-(void)eat;
@end
@implementation Animal
-(void)setName:(char *)name{
_name=name;
}
-(char *)getName{
return _name;
}
-(void)eat{
NSLog(@"动物吃东西...");
}
@end
//动物类的子类-狗
@interface Dog : Animal
-(void)eat;//这个地方的声明可以不写,因为父类中有这个方法的声明
-(void)kanMen;//狗独有的方法
@end
@implementation Dog
//这里是重写了父类中eat方法,Dog对象在调用eat方法是优先调用自己的方法.
-(void)eat{
NSLog(@"狗吃东西...");
}
-(void)kanMen{
NSLog(@"狗看门...");
}
@end
//动物类的子类-猫
@interface Cat : Animal
-(void)eat;
@end
@implementation Cat
-(void)eat{
NSLog(@"猫吃东西...");
}
@end
int main(){
Animal *am=[Dog new];
// [am kanMen];//这样调用是不对的,因为kanmen这个方法是子类Dog独有的,不能用多态指针直接调用.
//用多态的方式调用子类的方法-->强转
Dog *tempDog=(Dog *)am;
[tempDog kanMen];
am=[Cat new];
[am eat];//am现在只想Cat对象调用的是Cat中重写的eat方法.
return 0;
}
关于多态的一些思考
1.必须是继承关系的类才可以.而且是父类的指针代表子类对象.
2.可以用父类的指针指向任意一个子类的对象,操作子类对象调用方法,但是如果这个指针想要操作的是子类独有独有方法的时候不太适合用.