06-01、面向对象的三大特性:封装的基本概念

屏幕快照 2017-09-18 13.26.27.png
屏幕快照 2017-09-18 14.48.02.png
屏幕快照 2017-09-18 14.49.01.png
main.m
#import <Foundation/Foundation.h>
#import "Gun.h"

int main(int argc, const char * argv[]) {

// 1.创建一把枪
Gun *gun = [Gun new];
// 2.设置枪的子弹数量
//    gun->_bullet = 100;
// 引发这个问题的原因: 因为成员变量是public, 给成员变量赋值的时, 赋值的值不受我们的约束
//    gun->_bullet = -100;

[gun addBullet:100];

// 3.射击
[gun shoot];

// 4.查看子弹的剩余数据(获取成员变量的值)
//    NSLog(@"bullet = %i", gun->_bullet);
NSLog(@"BULLET = %i", [gun getBullet]);


return 0;
}
Gun.h
#import <Foundation/Foundation.h>

@interface Gun : NSObject
{
//    @public
int _bullet; // 子弹
// 虽然成员变量不是public之后外界不能直接访问了, 但是还是可以在本类的对象方法中直接访问
}

/**
 *  射击方法
 */
- (void)shoot;


// 提供一个方法用于设置成员变量的值
- (void)addBullet:(int)count;

// 提供一个方法用于返回成员变量的值
- (int)getBullet;
@end
Gun.m
#import "Gun.h"

@implementation Gun

- (void)shoot
{
if (_bullet > 0) {
    
    _bullet--;
    NSLog(@"打了一枪 , 还剩%i颗子弹", _bullet);
}else{
    NSLog(@"没有子弹了");
}
}

// addBullet就是对成员变量的封装
- (void)addBullet:(int)count // -100
{
/*
 封装: 屏蔽内部实现的细节, 仅仅对外提供共有的方法/接口
 好处: 保证数据的安全性
       将变化隔离
 规范: 一般情况下不会对外直接暴露成员变量, 都会提供一些共有的方法进行赋值
       成员变量都需要封装起来
 */
// 对传入的数据进行过滤
if (count < 0) {
    count = 0;
}
_bullet = count;
}

- (int)getBullet
{
return _bullet;
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容