IOS OC 多态(白话)

面向对象的三个基本特征:封装,继承,多态。本文浅谈我自己对多态的理解。

很多初学者在听老师讲多态的时候可能会比较迷糊,有的可能明白了大致的概念但是自己真正实施就会遇到困难,或者更有的你其实早就会了多态只是不知道这叫多态而已。废话少说,现在我们举一个最简单需要使用多态的例子。

假如你有一个Animal类,Animal类有三个子类,分别是Dog,Cat,Frog,现在你要用你的Owner主人类给三个小宠物喂食,如果不用多态机制的话你需要在Owner中创建三个方法,比如分别是以下三个方法:

-(void)feedMyDog:(Dog *)dog;

-(void)feedMyCat:(Cat *)cat;

-(void)feedMyFrog:(Frog *)frog;

看着还可以,但是如果你是动物园的饲养员,你要喂的动物几百种,这种思路你就得写几百种喂动物的方法。所以这个时候就应该多态上场了,一个方法治百病。我们可以在Owner类中申明一个方法:

-(void)feedMyAnimal:(Animal *)animal;

这个方法参数对象是Animal对象,而Dog,Cat,Frog作为Animal的子类是可以传进来的。在函数中这样声明三个动物类和一个主人类:

        Owner *owner=[[Owneralloc]init];

        Animal *dog=[[Dogalloc]init];

        Animal *cat=[[Catalloc]init];

        Animal *frog=[[Frogalloc]init];

 这样就声明就实现了三个Animal父类指针指向子类对象,这个时候调用函数不要看指针类型,而是看调用函数的对象,这种不看指针看对象的方法调用的方法称为虚方法,所以有人说OC中的方法都是虚方法。另外,如果子类重写了父类的方法会调用自己类的方法,没有重写的话还是调用父类的。

        [owner feedMyAnimal:dog];

        [owner feedMyAnimal:cat];

        [owner feedMyAnimal:frog];

这样就实现了多态机制,程序运行输出结果是:

dog eat food

cat eat food

frog eat food

总结

1.没有继承就不能实现多态机制,多态机制是建立在继承之上,没有Animal父类指针指向子类Dog Cat动物怎么能实现上面的多态呢
2.在代码中的体现:父类指针指向子类对象
3.多态好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了
4.局限性:父类类型的变量不能直接调用子类特有的方法,比如你在Dog中声明一个run的方法,如果用上面的dog对象调用是会报错的,如果必须向调用需要强制转化。


版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/yuqingzhude/p/4836548.html