zoukankan      html  css  js  c++  java
  • OC继承和多态

    一 :继承

         1)类和类之间的关系

         2)父类:  Animal

         3) 子类: Dog  Cat  

         4) 子类继承了父类的属性和方法 

           子类重写父类的方法的时候不用声明父类的方法,因为父类中已经声明了该方法,子类声明中导入了父类的声明。

    继承的好处:1>抽取出了重复的代码、2>建立了类和类之间的联系
    继承的缺点:耦合性太强,也就是指类和类之间的关联性太强
    注意:组合模型和继承之间的区别,及组合模型的优点。
    OC语言是单继承语言。在oc语言中,基本上所有类的根类都是NSObject类。
     
    三:继承注意点
    OC语法中不允许子类和父类拥有相同名称的成员变量,但允许拥有相同方法
    》重写:子类重新实现了父类中的某个方法 (子类中可以不用声明)
     
    》调用对象的某个方法,优先在本类中找,如果没有再到父类中找
    子类可以继承父类的所有的属性和方法,但是注意有一些属性是访问不了的
       比如私有属性值,子类访问不了,还要定义在父类.m文件中得属性值和方法,子类也无法访问。
    组合性:当某个类拥有另外一个类的属性时,可以让这个类拥有它
     
    提示:每个类中都有一个super class指针,该指针指向自己的父类。对象中有一个isa指针,该指针指向调用该对象的类。
     

      继承和组合

    继承的适用场合:

    (1)当两个类拥有相同的属性和方法时,就可以将相同的属性和方法抽取到一个父类中。

    (2)当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类(考虑),在这种情况下,也可以考虑使用组合。

    继承:###是xxx,如狗是动物,可以让狗继承动物类

    组合:###拥有xxx,如学生有书,可以让书这个类作为学生类的属性

     
    二:多态:基本概念

    多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态。

    在使用多态是,会进行动态检测,以调用真实的对象方法。

    多态在代码中的体现即父类指针指向子类对象。

    Person *p = [Person new];

            [p cry];  //Person

            

            Man *man = [Man new];

            [man cry];//Man

            

            Woman *woman = [Woman new];

            [woman cry];//Woman

            

            //动态类型:

            //OC中允许在程序执行的时候才去确定对象的类型

            //用谁new的就是什么类型

            //多态

            Person *p1 = [Man new];

            [p1 cry];

            

            //定义一个方法,传哪个对象,就是哪个对象的哭的方法

            

            [p cryWithObject:woman];

            

            //p ->person

            //(Man*)p   ---> Man

            Man *m1 = (Man*)p;

    //        [m1 test]; //错误的用法 父类无法调用子类特有方法

            

            //p1-->man

            //

            Man *m2 = (Man*)p1;

            [m2 test]; //可以调用

            

     

    好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。

    局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。

    多态的注意点

    备注:Person为父类,Son为子类,cry为子类的特有的方法
        Person *p = [Person new];

        Son *s = (Son *)p;

        [s cry];

    上面的代码错误,因为父类的对象不能访问子类的特有方法,系统会自动检测对象的真实指向。    

        Person *p1 = [Son new];

        Son *s1 = (Son *)p1;

        [s1 cry];

    上面的代码没问题,但是必须得将父类指向的指针强转为子类的指针。
     继承的注意点

         1)子类不能定义和父类同名的成员变量

        2)子类可以定义和父类同名的方法--重写

        3)父类的@private声明的私有属性,可以被继承,但是不能访问

           .m中直接定义的变量,私有的变量,不可以被继承的

     

  • 相关阅读:
    如何通过css控制内容显示顺序 第二行的内容优先显示
    《掌上流年》“国内首部微信日记”出版
    Hello Kitty微信主题很可爱?小心财产安全!
    第三方网站不能调用微信公众平台里的图片了 显示"此图片来自微信公众号平台未经允许不可引用"
    鼓浪屿船票也能用微信支付了
    excel判断单元格包含指定内容的函数用=IF(COUNTIF(A1,"*内容*"),"0","1")
    认证的政府与媒体类订阅号可取得网页授权接口了
    来八卦一下常刷微信朋友圈的你属于什么类型
    微信稳居Android App排行榜4月份国内榜首
    [福利]非认证公众帐号也能申请微信连Wi-Fi了
  • 原文地址:https://www.cnblogs.com/-boy/p/4069952.html
Copyright © 2011-2022 走看看