黑马程序员技术交流社区

标题: 多态 [打印本页]

作者: 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