zoukankan      html  css  js  c++  java
  • 黑马程序员-OC对象的三大特性

    OC语言是面向对象的语言,其三大特性必不可少。

    一、封装是一个很重要的概念,它避免外界直接访问或修改对象的属性,可以过滤不合理的值,让外界不必关心内部的细节。通过set方法来让外部设置成员的属性值,通过get方法来获得对象属性值。

     1 #import <Foundation/Foundation.h>
     2 @interface Student : NSObject</span></span>
     3 {
     4     int  _age;        //以下划线开头,避免和局部变量弄混
     5     int _no; 
     6 }
     7 
     8 - (void)setAge:(int)newAge;    // set方法的声明,函数名和参数用:隔开,返回值一定是void型
     9 - (int)age;                    // get方法的声明
    10 - (void)study;
    11 @end
    12 
    13 @implementation Student
    14 - (void)setAge:(int)newAge       // set方法的实现</span>
    15 {
    16    
    17     if (newAge <= 0)             // 对传进来的参数进行过滤
    18     {
    19         newAge = 1;
    20     }
    21     
    22     _age = newAge;
    23 }
    24 
    25 - (int)age                       // get方法的实现</span>
    26 {
    27     return _age;
    28 }
    29 - (void)study</span>
    30 {
    31     NSLog(@"%d岁的学生在学习", _age);
    32 }
    33 @end
    34 
    35 int main()
    36 {
    37     Student *stu = [Student new];
    38     [stu setAge:10];                             // 调用对象的set方法
    39     NSLog(@"学生的年龄是%d岁", [stu age]);       // 调用函数的get方法
    40     [stu study]; 
    41      return 0;
    42 }

    注意事项:

    set方法

    1.作用: 提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤

    2.命名规范:

    1> 方法名必须以set开头

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

    3> 返回值一定是void

    4> 一定要接收一个参数,而且参数类型跟成员变量类型一致

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

    get方法

    1.作用:返回对象内部的成员变量

    2.命名规范:

    1> 肯定有返回值,返回值类型肯定与成员变量类型一致

    2> 方法名跟成员变量名一样

    3> 不需要接收任何参数

    二、继承可以实现之类与类之间的关系,抽取的公共代码,在原有的基础上扩充了方法。缺点是耦合性太强

    继承的使用场合:

    1>它的所有属性都是你想要的,一般就继承

    2>它的部分属性是你想要的,可以抽取出另一个父类

     1 @interface Animal : NSObject
     2 - (void)eat;
     3 @end
     4 
     5 #import <Foundation/Foundation.h>
     6 // Person
     7 @interface Person : NSObject
     8 {
     9     int _age;
    10 }
    11 
    12 - (void)setAge:(int)age;
    13 - (int)age;
    14 - (void)run;
    15 + (void)test;        //类方法,以+号开头
    16 @end
    17 
    18 @implementation Person
    19 + (void)test         //类方法实现
    20 {
    21     NSLog(@"Person+test");
    22 }
    23 - (void)run
    24 {
    25     NSLog(@"person---跑");
    26 }
    27 - (void)setAge:(int)age
    28 {
    29     _age = age;
    30 }
    31 - (int)age
    32 {
    33     return _age;
    34 }
    35 @end
    36 
    37 @interface Student : Person      // Student子类
    38 {
    39     int _no;
    40     // int _age;         // 不允许子类和父类拥有相同名称的成员变量
    41 }
    42 + (void)test2;
    43 @end
    44 
    45 @implementation Student</span>
    46 
    47 - (void)run            // 重写:子类重新实现父类中的某个方法,覆盖父类以前的做法</span>
    48 {
    49     NSLog(@"student---跑");
    50 }

    三、多态是把不同的子类当做父类来看,可以屏蔽不同子类之间的差异,写出通用的代码,作出通用的编程,以适应需求的变化。子类对象赋值给父类指针,父类指针来访问对应的属性和方法。

     1 @interface Animal : NSObject
     2 - (void)eat;
     3 @end
     4 
     5 @implementation Animal
     6 - (void)eat
     7 {
     8     NSLog(@"Animal-吃东西----");
     9 }
    10 @end
    11 
    12 @interface Dog : Animal          //狗之类继承动物父类
    13 - (void)run;     //增加跑方法
    14 @end
    15 
    16 @implementation  Dog
    17 - (void)run
    18 {
    19     NSLog(@"Dog---跑起来");
    20 }
    21 - (void)eat                      //重写方法
    22 {
    23     NSLog(@"Dog-吃东西----");
    24 }
    25 @end
    26 
    27 @interface Cat : Animal       //之类猫继承父类动物
    28 @end
    29 
    30 @implementation Cat
    31 - (void)eat                    //重写方法
    32 {
    33     NSLog(@"Cat-吃东西----");
    34 }
    35 @end
    36 
    37 int main()</span>
    38 {
    39    
    40     Animal *a = [Dog new];    // 多态:父类指针指向子类对象
    41     [a eat];                  // 调用方法时会检测对象的真实形象
    42     return 0;
    43 }
  • 相关阅读:
    第一阶段-意见评论
    团队冲刺第15天
    团队冲刺第14天
    第十三周进度报告
    团队冲刺第13天
    团队冲刺第12天
    团队冲刺第11天
    SCRUM第二阶段第九天
    SCRUM第二阶段第八天
    SCRUM第二阶段第七天
  • 原文地址:https://www.cnblogs.com/pangjiayang/p/3956082.html
Copyright © 2011-2022 走看看