zoukankan      html  css  js  c++  java
  • 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对象调用是会报错的,如果必须向调用需要强制转化。


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

  • 相关阅读:
    数据库连接池使用(一):使用C#数据库连接池
    开包即食的教程带你浅尝最新开源的C# Web引擎Blazor
    HTTP协议之内容协商
    浅谈Cookie、Session与Cache的区别
    应用程序框架(一):DDD分层架构:领域实体(基础篇)
    持续集成是什么?
    Git版本控制 Git、github,gitlab相关操作
    Spring-Cloud-Netflix-Ribbon&Feigen
    Spring-Cloud-Netflix-Eureka集群搭建
    java面试题-javaSE基础
  • 原文地址:https://www.cnblogs.com/yuqingzhude/p/4836548.html
Copyright © 2011-2022 走看看