面向对象的三个基本特征:封装,继承,多态。本文浅谈我自己对多态的理解。
很多初学者在听老师讲多态的时候可能会比较迷糊,有的可能明白了大致的概念但是自己真正实施就会遇到困难,或者更有的你其实早就会了多态只是不知道这叫多态而已。废话少说,现在我们举一个最简单需要使用多态的例子。
假如你有一个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对象调用是会报错的,如果必须向调用需要强制转化。
版权声明:本文为博主原创文章,未经博主允许不得转载。