黑马程序员技术交流社区

标题: RIDP Note VII——封装的概念与实现 [打印本页]

作者: RIDP    时间: 2015-9-20 12:12
标题: RIDP Note VII——封装的概念与实现
well well,这里介绍一下封装的概念和简单的实现
@interface gun : NSObject
{
    int _ammo;
}
-(void)shoot;
//新加的修改弹药的方法
-(void)setammo:(int)count;
@end

@implementation gun

-(void)shoot{
    if (_ammo>0){
    _ammo--;
    NSLog(@"biu biu biu~~还能来%d发",_ammo);
    }else{
        NSLog(@"撒比没弹药了");
    }
}
//修改弹药的方法
-(void)setammo:(int)count{
    if (count>0) {
        _ammo=count;
    }else{
        _ammo = 0;
    }
}
@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //这样上面的类的属性就没有被暴露为public,所以gun类的属性是安全的,因为修改其属性有相应的方法
//        并且该方法同样有一个安全区间的限制
//        这就是一种封装
//        更简单的说,就是我们实现了对象内部属性相对应的get/set方法,在访问属性的时候不是直接对属性访问
//  而是通过对象所有的方法进行间接的访问
        gun *piu = [gun new];
        [piu setammo:-12];
        [piu shoot];
        
    }
    return 0;
}

//那么正常情况下,封装是如何实现的?
//见下方
//————————————————————————————————————————————————————————————————————————————————————————

——————————————————————————————————————————
person.h[声明get/set方法]
——————————————————————————————————————————
typedef enum {kSexMale,kSexFemale}sex;
@interface person : NSObject
{
    //下属四个属性,姓名年龄身高性别
    NSString *_name;
    int _age;
    sex _sex;
    float _height;
}
//每个实例变量需要写两个方法,一个设置(set)方法,一个获取(get)方法
  set方法的书写规范
1)set一定是个对象方法(-号开头)
2)set方法不能有返回值(void类型)
3)方法必须以set开头
4)set后跟变量去掉'_',并且首字母大写
5)set方法必然有参数,且参数类型和实例变量的类型一致
6)set方法的形参名一般是去掉下划线的实例变量名称
7)形参名不能和实例变量名重复
8)set方法实现中一定要用形参给实例变量赋值


-(void)setName:(NSString *)name;//_name的set方法,后续设置_name的值一律使用此方法
-(void)setAge:(int)age;
-(void)setSex:(sex)sex;
-(void)setHight:(float)height;
  get方法的书写
1)get方法一定是一个对象方法(-开头)
2)get方法一定有返回值,且返回类型和实例变量的类型要一致
3)get方法的方法名是去掉下划线的实例变量名
4)get方法没有参数
5)get方法的实现中,一定返回实例变量值[return]



-(NSString *)name;//name的get方法,后续获取name一律使用此方法
-(int)age;
-(sex)sex;
-(float)height;



@end
——————————————————————————————————————
person.m[这里实现对应方法]
——————————————————————————————————————
#import "person.h"

@implementation person
//set
-(void)setName:(NSString *)name{
    _name=name;
}
-(void)setAge:(int)age{
    if (age>=0) {
        _age=age;
    }
}
-(void)setSex:(sex)sex{
    _sex=sex;
}
-(void)setHight:(float)height{
    if (height>=0) {
        _height = height;
    }
}


//get
-(NSString *)name{
    return _name;
}
-(int)age{
    return _age;
}
-(sex)sex{
    return _sex;
}
-(float)height{
    return _height;
}
@end
——————————————————————————————————————————
main.m
——————————————————————————————————————————
#import "person.h"

@implementation person
//set
-(void)setName:(NSString *)name{
    _name=name;
}
-(void)setAge:(int)age{
    if (age>=0) {
        _age=age;
    }
}
-(void)setSex:(sex)sex{
    _sex=sex;
}
-(void)setHight:(float)height{
    if (height>=0) {
        _height = height;
    }
}


//get
-(NSString *)name{
    return _name;
}
-(int)age{
    return _age;
}
-(sex)sex{
    return _sex;
}
-(float)height{
    return _height;
}
@end
作者: wjy0916    时间: 2015-9-20 12:13
学习了,加油,继续,
作者: malong0517    时间: 2015-9-21 10:53
很详细,学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2