同样,我们用一个示例来说明一下,说明写在代码注释中:- /*
- 多态的基本介绍及应用场景
- 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 = [Dog new]
- 4、正常情况下我们创建一个狗的对象应该是Dog *d = [Dog new],两者的区别在于指针类型
- 5、父类的指针指向了子类的对象,这就是所谓的多态
- 6、通过多态,可以实现void feed(Animal *a)即能喂猫又能喂狗
- */
- void feed(Animal *a) {
- [a eat]; // 调用对象的吃方法
- }
- int main() {
- Dog *dog = [Dog new]; // 可以写成Animal *dog = [Dog new];
- feed(dog);
- Cat *cat = [Cat new]; // 可写成Animal *cat = [Cat new];
- feed(cat);
-
- Animal * animal = [Animal new];
- feed(animal);
-
- return 0;
- }
复制代码 运行结果:2014-03-13 12:02:42.260 a.out[1276:507] Dog is eating... 2014-03-13 12:02:42.262 a.out[1276:507] Cat is eating... 2014-03-13 12:02:42.263 a.out[1276:507] Animal is eating...
|