您的位置:首页 > 编程语言 > C语言/C++

黑马程序员_OC语言之面向对象的三大特性(封装、继承、多态)

2014-04-28 16:25 911 查看
面向对象的三大特:封装、继承、多态



 ------ IOS培训、android培训、期待与您交流!-------

一、封装(用set方法对成员变量进行封装)

    #import<Foundation/Foundation.h>

    @interface Student:NSObject

    {
        //@public  成员变量尽量不要用@public

        int age;    
     }

     - (void)setAge:(int)newAge;

     - (int)age;            
     - (void)study;

    @end

    @implement Student

    - (void)setAge:(int)newAge

    {
         //对传进来的参数进行过滤

         if(newAge <= 0)

         {
              newAge = 1;
          }

         age=newAge;

     }

     - (int)age
     {
          return age;
      }

    - (void)study

    {
         NSLog(@"%d岁的学生在学习",age);
     }

    @end

     int main()

     {
          Student *stu = [Student new];

          [stu newAge:-10];

          //stu->age = 20;这个时候已经不能直接给age赋值

          //NSLog(@"学生的年龄是%d岁,",stu->age);//因为age不是public,所以不能这样用,这个时候需要提供一个方法获取成员变量;

          NSLog(@"学生的年龄是%d岁,",[stu age]);

          [stu study];  
      }

     小结:1、对对象的成员变量的赋值进行限定

           2、set方法:作用:提供一个方法给外界设置成员变量值,可以在方法里对参数进行过滤

                      命名规范:1>、方法名必须以set开头;

                               2>、set后面跟上成员变量的名称,成员变量的首字母必须大写;

                               3>、返回值一定是void;
  
                               4>、一定要接收一个参数,而且参数类型跟成员变量的类型一致;

                               5>、形参的名称不能跟成员变量名一样;

            3、用set方法对成员变量封装;

            4、get方法:作用:返回对象内部的成员变量

                        命名规则:1>、肯定有返回值,返回值类型肯定与成员变量类型一致

                                  2>、方法名与成员变量名一样

                                  3>、不需要接受任何参数

            5、成员变量只允许外界访问,不允许外界修改用get方法

                  成员变量的命名规则:

                (1)、一定要以下划线_开头:作用:1>、让成员变量和get方法的,名称区别开

                                     2>、可以跟局部变量区分开,一看到下划线开头的变量,一般都是成员变量

二、继承

    类A

    类B 继承 类A

    #import<Foundation/Foundation.h>

    //animal的声明和实现

    @interface Animal : NSObject

    {
         int _age;

         double _weight;

     }

      - (void)setAge:(int)age;

     - (int)age;

     - (void)setWeight:(double)weight;

     - (double)weight;

    @end

    @implementation   Animal

     - (void)setAge:(int)age

     {
          _age=age;

      }

     - (int)age

     {
          return _age;

      }

     - (void)setWeight:(double)weight

     {
          _weight=weight;
      }

     - (double)weight

     { 
           return _weight;

      }
   
    @end

    //狗的声明和实现,继承了animal,相当于拥有了animal里面的所有成员变量和方法

    //animal称为Dog的父类
    @interface Dog : Animal

    @end

    @implementation   Dog

    @end

    //猫的声明和实现,继承了animal

    @interface Cat : Animal

    @end

    @implementation   Cat

    @end

    int main()

    {
        Dog *d = [Dog new];

        [d setAge:10];

         NSLog(@"age = %d",[d age]);

         Cat *c = [Cat new];

         [c setWeight:7.0];

         NSLog(@"weight = %d",[c weight]); 
     }

     1、继承的好处:

        1>、抽取重复代码

        2>、建立了类之间的关系

        子类可以拥有父类中的所有成员变量和方法。

        注意点:基本上所有类的根类都是NSObject

        坏处:耦合
b111
性太强    

     2、继承的使用注意:

        1>、父类必须声明在子类的前面,与实现无关

        2>、不允许子类和父类拥有相同名称的成员变量

        3>、可以允许子类和父类拥有相同名称的方法,如果子类和父类中都有相同名称的方法,当子类对象调用方法时,先查看子类中的方法,就近原则,

        4>、当子类中拥有父类中相同名称的方法,又称为该方法的重写;即子类重新实现父类中的方法,覆盖父类以前的做法

        5>、调用某个对象的方法时,优先去当前对象中找;如果找不到,就去父类中找

     3、继承的使用场合:

        1>、当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中

        2>、当A类拥有B类中的部分属性和方法时,让B类继承A类   

     4、super关键字

        1>、[super 方法名] 调用父类中的某个方法

        2>、super处在对象方法中,那么就会调用父类的对象方法

        3>、super处在类方法中,那么就会调用父类的类方法

        4>、super的使用场合:子类重写父类的方法想保留父类的一些行为
        
三、多态(多种形态)没有继承就没有多态

    #import<Foundation/Foundation.h>

   @interface  Animal : NSObject

    - (void)eat;

    @end

    @implementation  Animal

    - (void)eat

    {
        NSLog(@"Animal吃东西————");
     }
    @end

    @interface  Dog : Animal

    @end

    @implementation  Dog

    - (void)eat

    {
        NSLog(@"Dog吃东西————");
     }
    @end

     int main()

    {  //多种类型
  
        Dog *d = [Dog new];// Dog类型

        //多态:父类指针指向子类对象

        Animal *a = [Dog new]; //Aniaml类型

        //调用方法时会检测对象的真实对象

        [a eat];//调用Dog类中的eat,因为a指针指向的Dog的类型

         return 0;
      }

      1、多态的好处

         1>、节省代码

         2>、如果函数\方法参数中使用的是父类类型,就可以传入父类、子类对象

      2、多态的局限性:

         1>、父类类型的变量不能直接调用来调用子类的方法,必须强制转换为子类类型变量后,才能直接调用子类特有的方法

         2>、代码的体现:父类类型的指针指向子类对象

          
 ------ IOS培训、android培训、期待与您交流!-------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐