黑马程序员技术交流社区
标题:
多态
[打印本页]
作者:
Flower.
时间:
2015-12-2 11:05
标题:
多态
/*
什么是多态?
多态:是指一种事物的多种形态
生活中的体现:
人:警察,小偷
动物: 狗, 猫
代码体现: 父类的指针指向子类的对象
Dog *d=[Dog new];//普通写法
Animal *a=[Dog new];//多态写法
多态有什么作用?
具有极强的扩展性.父类的一个指针可以表示不同的子类为对象.
多态有什么局限?
父类的指针指向子类时,如果要调用子类的独有方法,必须强转.
*/
#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
-(void)eat{
NSLog(@"狗吃东西...");
}
-(void)kanMen{
NSLog(@"狗看门...");
}
@end
//动物类的子类-猫
@interface Cat : Animal
-(void)eat;
@end
@implementation Cat
-(void)eat{
NSLog(@"小猫吃东西...");
}
@end
//动物类的子类-猪
@interface Pig : Animal
-(void)eat;
@end
@implementation Pig
-(void)eat{
NSLog(@"小猪吃东西...");
}
@end
//多态
void eatfood(Animal *am);
void eatfood(Animal *am){
for (int i=0; i<3; i++) {
[am eat];
}
}
int main(){
//普通写法
Cat *cat=[Cat new];
// [cat eat];
// [cat eat];
// [cat eat];
// eatfood(cat);
Dog *dog=[Dog new];
[dog kanMen];
// [dog eat];
// [dog eat];
// [dog eat];
// eatfood(dog);
Pig *pig=[Pig new];
// eatfood(pig);
// eatfood(...);
//
//多态写法
//前题:
//1.必须是继承关系的类才可以.而且是父类的指针代表子类对象.
//父类指针指向子类对象,调用方法时,会自动找子类相对应的方法.
//扩展性很强
Animal *am=[Dog new];
//会有警告:因为父类中没有这个方法.不能这么用.这是多态的局限性.
// [am kanMen];
//用多态的方式调用子类的方法-->强转
Dog *tempDog=(Dog *)am;
[tempDog kanMen];
am=[Cat new];
// [am eat];
// am=[Pig new];
// [am eat];
// ...
//
return 0;
}
//void eatfood(Cat *cat);
//
//void eatfood(Cat *cat){
// for (int i=0; i<3; i++) {
// [cat eat];
// }
//}
//
//void eatfoodDog( Dog *dog);
//
//void eatfoodDog( Dog *dog){
// for (int i=0; i<3; i++) {
// [dog eat];
// }
//}
//
//void eatfoodPig( Pig *pig);
//
//void eatfoodPig(Pig *pig){
// for (int i=0; i<3; i++) {
// [pig eat];
// }
//}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2