1.面向对象之封装

第一部分  基础知识:


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)可以跟局部变量分开,一看到下划线开头的变量一般都是成员变量。


第二部分 代码分析:

类属性:C成绩、OC成绩
类方法:
#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

1.如果我们在传入值的时候不使用setter,而直接赋值 如下:
[s _cScore:80] ;
编译器错误提示:

由于类属性不是@public ,对象无法直接访问到_cScore,只能通过setter来实现对_cScore的赋值。

2.当我们传入错误参数,例如传入成绩为负值的时候:
    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是个非法数据,封装中过滤外界传过来的参数,保护数据的安全性。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值