Sian 发表于 2014-3-13 12:05:04

多态的基本介绍

同样,我们用一个示例来说明一下,说明写在代码注释中:
/*
多态的基本介绍及应用场景
1.什么叫多态?
    多态即父类的指针,指向子类的对象;
*/
#import <Foundation/Foundation.h>

/*******创建一个动物类做为父类*******/
@interface Animal : NSObject {

}// 简化一下,没有成员变量

- (void)eat;// 声明一个吃的方法

@end

@implementation Animal


//简单实现吃的方法
- (void)eat {

    NSLog(@"Animal is eating...");
}
@end

/********创建一个狗的类**********/
@interface Dog : Animal {// 继承动物类

}

@end

@implementation Dog

// 重写吃方法
- (void)eat {

    NSLog(@"Dog is eating...");

}
@end


/********创建一个猫的类********/
@interface Cat : Animal {// 继承动物类

}

@end

@implementation Cat

// 重写吃方法
- (void)eat {

    NSLog(@"Cat is eating...");
}
@end
/********三个类的创建与声明实现结束********/

/*创建一个函数,用来喂养动物
1、关键在于函数的形参类型,如果是(Dog *)则只能喂狗,如果是(Cat *)则只能喂猫
2、如果是(Animal *)则只能喂动物,但狗和猫都是动物类的子类,多态在这里体现出来
3、形参类型是(Animal *),如果把狗的对象传进去,等同于Animal *a =
4、正常情况下我们创建一个狗的对象应该是Dog *d = ,两者的区别在于指针类型
5、父类的指针指向了子类的对象,这就是所谓的多态
6、通过多态,可以实现void feed(Animal *a)即能喂猫又能喂狗
*/
void feed(Animal *a) {

    ;// 调用对象的吃方法

}

int main() {

    Dog *dog = ;// 可以写成Animal *dog = ;
    feed(dog);

    Cat *cat = ;// 可写成Animal *cat = ;
    feed(cat);
   
    Animal * animal = ;
    feed(animal);
   
    return 0;
}运行结果:2014-03-13 12:02:42.260 a.out Dog is eating...2014-03-13 12:02:42.262 a.out Cat is eating...2014-03-13 12:02:42.263 a.out Animal is eating...

Sian 发表于 2014-3-13 12:19:57

本帖最后由 Sian 于 2014-3-13 12:21 编辑

补充说明一下:
1、多态存在一定的局限性,比如说父类中如果没有eat方法,则不参直接这样使用;
2、父类类型变量不能直接调用子类特有的方法
3、如果强制使用,需要转换类型,如:Animal *a = 编译器会发出警告,解决办法:Dog *d = (Dog *)a; 类似int a = (int)3.14;4、OC弱语法类型,在方法调用时会动态检测,因此编译会发出警告,但实际链接运行可正常执行
页: [1]
查看完整版本: 多态的基本介绍