第一部分 基础知识:
1. 什么是(对象)封装
封装就是将对象具有的一些属性和方法通过封装打包到一起,共同体现一个事物的特征。
2. 封装的好处
1)更加接近人类的思考方式;
2)只需要关注对象,不需要关注步骤;
3)将对象的属性保护起来,过滤外界传过来的参数,保护数据的安全性。
3. 封装方法
将对象变量的属性设置为private或者protected:根据需要通过set方法和get方法设置或者读取其属性值。
下面来介绍封装中要使用的方法:setter 和getter
set方法:
1. 作用:提供一个方法给外界设置成员变量值;
2.命名规范:
1) 方法名必须以set开头;
2)set后面跟上去除下划线的成员变量的名称,成员变量的首字母必须大写
3)set方法只需传入一个参数不需要返回值所以该函数为(void)型;
4)set需要接受一个参数,该参数类型必须和成员变量类型一致;
5)形参的名称不能跟成员变量名一样,规范写法是将成员变量名去除下划线。
get方法:
1. 作用:返回对象内部的成员变量
2. 命名规范:
1) 肯定有返回值,返回值类型与成员变量类型一致;
2) 名称为成员变量去掉下划线;
3)不需要接收参数4.封装的细节
成员变量名的命名规范:以下划线“_”开头。
作用:1)让成员变量和get方法的名称区分开
2)可以跟局部变量分开,一看到下划线开头的变量一般都是成员变量。
第二部分 代码分析:
#import <Foundation/Foundation.h>
@interface Score :NSObject
{
// 此处可以省略不写
@private
int _cScore;
int _ocScore;
int _totalScore;
double _averageScore;
}
// C语言成绩的setter和getter定义
- (void)setCScore:(int)cScore;
- (int)getCScore;
// OC语言成绩的setter和getter定义
- (void)setOcScore:(int)ocScore;
- (int)getOcScore;
// 总分只需要被读取,所以只设置getter定义
- (int)getTotalScore;
// 平均分只需要被读取,所以只设置getter定义
- (double)getAverageScore;
@end
@implementation Score
// C语言成绩的setter和getter实现
- (void)setCScore:(int)cScore
{
// 对传进来的cScore进行过滤
if(cScore <= 0) cScore = 0;
_cScore = cScore;
}
- (int)getCScore
{
return _cScore;
}
// OC语言成绩的setter和getter实现
- (void)setOcScore:(int)ocScore
{
// 对传进来的ocScore进行过滤
if(ocScore <= 0) ocScore = 0;
_ocScore = ocScore;
}
- (int)getOcScore
{
return _ocScore;
}
// 总分getter实现
- (int)getTotalScore
{
return _cScore + _ocScore;
}
// 平均分getter实现
- (double)getAverageScore
{
return (double)(_cScore + _ocScore)/2;
}
@end
int main()
{
Score *s = [Score new];
[s setCScore:90];
[s setOcScore:95];
int total = [s getTotalScore];
NSLog(@"total = %i",total);
double ave = [s getAverageScore];
NSLog(@"ave = %f",ave);
return 0;
}
运行结果:
2015-05-08 15:03:27.881 3 - 封装的练习[1399:303] total = 185
2015-05-08 15:03:27.883 3 - 封装的练习[1399:303] ave = 92.500000
Program ended with exit code: 0
[s _cScore:80] ;
编译器错误提示:
Score *s = [Score new];
[s setCScore:90];
[s setOcScore:-20];
运行结果:
2015-05-08 15:14:57.487 3 - 封装的练习[1456:303] total = 90
2015-05-08 15:14:57.489 3 - 封装的练习[1456:303] ave = 45.000000
Program ended with exit code: 0
由于传入的ocScore是个非法数据,封装中过滤外界传过来的参数,保护数据的安全性。