zoukankan      html  css  js  c++  java
  • 「OC」 封装

    一、面向对象和封装

      面向对象的三大特性:封装、继承和多态

      在OC语言中,使用@interface和@implementation来处理类。

       

      @interface就好像暴露在外面的时钟表面,像外界提供展示以及接口。@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来。

     二、set方法

      在开发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public、@protected等关键字修饰,而是使用Set方法来为对象提供成员变量的值。在set方法的内部也可以对一些不合理的赋值进行筛选过滤。

      set方法的作用:为外界提供一个设置成员变量值的方法

      命名规范:

        (1)方法名必须以set开头

        (2)set后面跟上成员变量的名称,首字母大写

        (3)返回值一定是void

        (4)一定要接收一个参数,而且参数类型需要和成员变量的类型一致

        (5)形参名不能喝成员变量名一样(苹果官方推荐成员变量名前加_以示区分)

      Set方法的好处:

        (1)不让数据暴露在外,保证了数据的安全性

        (2)对设置的数据进行过滤

    三、get方法

      get方法的作用:为调用者返回对象内部的成员变量

      命名规范:

        (1)一定有返回值,返回值的类型和成员变量的类型一致

        (2)方法名和成员变量名一样

        (3)不需要接收任何参数

    四、使用示例:

      方法的声明:

    复制代码
     1 #import <Foundation/Foundation.h>
     2 @interface Student : NSObject
     3 {
     4     // 成员变量尽量不要用@public
     5     // @public
     6     int _age;
     7     
     8     // 只读(readonly):只允许外界访问no,不允许外界修改no。
     9     // @public
    10     int _no;// 只需要提供get方法
    11 }
    12 
    13 - (void)setAge : (int)newAge;
    14 
    15 - (int)age;
    16 
    17 // 学习
    18 - (void)study;
    19 
    20 @end
    复制代码

      方法的实现:

    复制代码
    #import "Student.h"
    
    @implementation Student
    
    // set方法的实现
    - (void)setAge : (int)newAge{
    
        // 对传进来的参数进行过滤
        if (newAge <= 0){
            newAge = 1;
        }
    
        _age = newAge;
    
    }
    
    // get方法
    - (int)age
    {
    
        return _age;
    
    }
    
    - (void)study
    {
        NSLog(@"%d岁的学生正在学习",age);
    }
    
    @end
    复制代码

      主函数:   

    复制代码
     1 #import <Foundation/Foundation.h>
     2 #import "Student.h"
     3 
     4 int main()
     5 {
     6     Student *stu = [Student new];
     7 
     8     // stu->age = 10;
     9     
    10     [stu setAge : 10];
    11 
    12     [stu study];
    13     
    14     NSLog(@"学生的年龄是%d岁",[stu _age]);
    15     
    16     return 0;
    17 }
    复制代码

      注1:

        在实际的开发中,不一定set和get方法都会提供,如果内部的成员变量比如学生的学号这样的数据只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set方法。

      注2:

        成员变量名的命名以下划线开头,get方法名不需要带下划线,使用下划线开头有两个好处:(1)与get方法的方法名区分开来;(2)可以喝一些其他的局部变量区分开来,下划线开头的变量,通常都是类的成员变量。

    五、类方法

      直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类对象方法列表)

      类方法和对象方法对比:

      (1)对象方法

    • 以减号-开头
    • 只能让对象调用,没有对象,这个方法根本不可能被执行
    • 对象方法能访问实例变量(成员变量)

       (2)类方法

    • 以加号+开头
    • 只能用类名调用,对象不能调用
    • 类方法中不能访问实例变量(成员变量)
    • 使用场合:当不需要访问成员变量的时候,尽量用类方法

       (3)类方法和对象方法可以同名

    六、self关键字

      self是一个指针,谁调用了当前方法,self就指向谁

      【出现在对象方法中,就代表着当前对象,出现在类方法中,就代表着当前类】

      self的用途:

        (1)可以利用self->成员变量名访问当前对象内部的成员变量(仅在对象方法中)

        (2)[self 方法名];可以调用其他的对象方法或者是类方法

    七、封装练习

      设计一个成绩类

      代码:

    复制代码
     1 /*
     2  4.设计一个成绩类
     3  * C语言成绩(可读可写)
     4  * OC成绩(可读可写)
     5  * 总分(只读)
     6  * 平均分(只读)
     7 */
     8 #import <Foundation/Foundation.h>
     9 
    10 @interface Score : NSObject
    11 {
    12     int _cScore; // C语言成绩
    13     int _ocScore; // OC成绩
    14     
    15     int _totalScore;// 总分
    16     int _averageScoe; // 平均分
    17 }
    18 
    19 - (void)setCScore:(int)cScore;
    20 - (int)cScore;
    21 
    22 - (void)setOcScore:(int)ocScore;
    23 - (int)ocScore;
    24 
    25 - (int)totalScore;
    26 - (int)averageScore;
    27 
    28 @end
    29 
    30 @implementation Score
    31 - (void)setCScore:(int)cScore
    32 {
    33     _cScore = cScore;
    34     
    35     // 计算总分
    36     _totalScore = _cScore + _ocScore;
    37     _averageScoe = _totalScore/2;
    38 }
    39 - (int)cScore
    40 {
    41     return _cScore;
    42 }
    43 
    44 - (void)setOcScore:(int)ocScore
    45 {
    46     _ocScore = ocScore;
    47     
    48     // 计算总分
    49     _totalScore = _cScore + _ocScore;
    50     _averageScoe = _totalScore/2;
    51 }
    52 // 监听成员变量的改变
    53 
    54 - (int)ocScore
    55 {
    56     return _ocScore;
    57 }
    58 
    59 - (int)totalScore
    60 {
    61     return _totalScore;
    62 }
    63 - (int)averageScore
    64 {
    65     return _averageScoe;
    66 }
    67 @end
    68 
    69 
    70 int main()
    71 {
    72     Score *s = [Score new];
    73     
    74     [s setCScore:90];
    75     [s setOcScore:100];
    76     
    77     [s setCScore:80];
    78     
    79     
    80     int a = [s totalScore];
    81     
    82     NSLog(@"总分:%d", a);
    83     
    84     return 0;
    85 }
    复制代码
    如果一件事情你觉得难的完不成,你可以把它分为若干步,并不断寻找合适的方法。最后你发现你会是个超人。不要给自己找麻烦,但遇到麻烦绝不怕,更不要退缩。 电工查找电路不通点的最快方法是:分段诊断排除,快速定位。你有什么启示吗? 求知若饥,虚心若愚。 当你对一个事情掌控不足的时候,你需要做的就是“梳理”,并制定相应的规章制度,并使资源各司其职。
  • 相关阅读:
    基于文件数据库的规则引擎处理海量高复杂度数据(二,解决方案)
    内存数据库内核开发 工作日志(innodb的原理,算法详细剖析)(九)
    swift检测字符串是否在数组字符串中
    swift cell自定义左滑手势处理
    rxswift cell按钮绑定的重用问题
    swift代码统一编码规范
    TZImagePickerController获取原图
    swift 地区选择器选中数据操作
    iOS是否审核需要关闭一些操作
    项目概要评审
  • 原文地址:https://www.cnblogs.com/wvqusrtg/p/4486740.html
Copyright © 2011-2022 走看看