Objective

前面我们了解了一些封装的思想, 所谓的封装就是把一些成员变量保护起来, 不让别人去随意修改, 其实这个和我们日常生活中的包装很像, 比如超市里的真空包装食品, 经常真空包装的保护, 那么食物就不容易发霉过期, 那么在OC程序里面的封装也是同样的道理, 否则一直使用@public会让别人随意改动自己的数据, 从而导致程序崩溃, 无法正常的运作.


那么封装有什么规范呢? 下面让我们来看看:

需求: 创建一个学生类, 知道他的数学分和语文分, 定义一个方法需要知道他两科的总分, 以及平均分.

属性:

1. 数学分

2. 语文分


方法:

1. 总分

2. 平均分


那么我们来看看例子:

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
    int _mathScore; //数学成绩
    int _languageScore; //语文成绩
    
    int _totalScore; //总分
    int _averageScore; //平均分
}

- (void)setMathScore:(int)mathScore;  //数学分的set方法声明
- (int)mathScore;  //数学分的get方法声明

- (void)setLanguageScore:(int)languageScore;  //语文分的set方法声明
- (int)languageScore;  //语文分的get方法声明

- (int)totalScore; //总分方法声明
- (int)averageScore;  //平均分方法声明
@end

@implementation Student

- (void)setMathScore:(int)mathScore  //数学分set方法实现
{
    _mathScore = mathScore;
    _totalScore = _mathScore + _languageScore;
    _averageScore = _totalScore / 2;
}
- (int)mathScore  <span style="font-family: Arial, Helvetica, sans-serif;">//数学分get方法实现</span>
{
    return _mathScore;
}

- (void)setLanguageScore:(int)languageScore <span style="font-family: Arial, Helvetica, sans-serif;">//语文分set方法实现</span>
{
    _languageScore = languageScore;
    _totalScore = _mathScore + _languageScore;
    _averageScore = _totalScore / 2;
}
- (int)languageScore  <span style="font-family: Arial, Helvetica, sans-serif;">//语文分get方法实现</span>
{
    return _languageScore;
}

- (int)totalScore  //总分方法的实现
{
    return _totalScore;
}
- (int)averageScore  //平均分方法的实现
{
    return _averageScore;
}

@end

int main()
{
    Student *stu = [Student new];
    [stu setMathScore: 80];
    [stu setLanguageScore:60];
    
    int a = [stu totalScore];
    NSLog(@"总分是%d.", a);
    
    int b = [stu averageScore];
    NSLog(@"平均分%d", b);
    
    return 0;
}


看完例子之后, 我们讲解一下注意事项:

1. 成员变量声明的时候为了规范, 必须以" _ "符号开头, 加上驼峰标识.

2. 如果不是有必要的需求, 不要用@public, 改而使用set方法和get方法.

3. 方法名的名字和参数的名字越详细越好, 最好长的像句子一样, 因为苹果公司推荐这么使用.



封装的好处:

1. 可以过滤一些不合理的数值

2. 屏蔽掉内部的赋值方式

3. 让别人可以不必在意内部的细节


好了, 这次我们就到这里, 下次我们继续~~

原文地址:https://www.cnblogs.com/iOSCain/p/4282855.html