OC学习笔记十 封装

封装的基本概念:

将实现细节隐藏起来,为外部访问提供公共的方法,避免脏数据和错误调用。


使用封装的好处:

将变化隔离,提高安全性(避免的脏数据)

例如:Cat类中有_age属性,该属性不能为零,如果不通过隐藏实现细节,则可能以赋值为不合理的数据


一声明类

@interface Cat : NSObject
{
    @private
    int _age;
    NSString *_name;
}

/*
 为什么要封装?
 如果成员变量可以直接访问的,很可能会赋值为脏数据,通过封装,
 隐藏对象属性的实现细节,仅对外提供公共的访问方法。
 
 OC一般采取封装,为成员变量提供 赋值 和 获取的方法,避免直接访问成员变量
 给成员变量赋值的方法称为 set 方法
 获取成员变量值的方法称为 get 方法
 
 */


/*
 set 方法:
 1.一定是对象方法(类方法不能访问成员变量)
 2.没用返回值
 3.方法名以set开头,后面跟上成员变量名字,去掉下划线,并且首字母大写
 4.有参数,以成员变量的类型为参数类型,并且参数名用成员变量名字,去掉下划线
 */
-(void)setAge:(int) age;

/*
 get 方法:
 1.一定是对象方法
 2.有返回值,并且返回值的类型和 成员变量 的类型一致
 3.方法名直接用去掉下划线的成员变量名
 4.没用参数
 */
-(int)age;

-(void)setName:(NSString *)name;
-(NSString *)name;

-(void)eat;
@end


二实现类

@implementation Cat

-(void)setAge:(int) age
{
    //当age<0时,则是不合理数据,则该赋值为0。
    _age=age<0?0:age;
}


-(int)age
{
    return _age;
}


-(void)setName:(NSString *)name
{
    _name=name;
}


-(NSString *)name
{
    return _name;
}


-(void)eat
{
    NSLog(@"Cat eat ..");
}

@end


三主函数

int main(int argc, const char * argv[])
{
    
    @autoreleasepool {
        //初始化实例 cat1
        Cat *cat1 = [Cat new];
        //赋值 合理的值
        [cat1 setAge:10];
        NSLog(@"cat1 age=%d",[cat1 age]);
  
        
        //初始化实例 cat2
        Cat *cat2 = [Cat new];
        //赋值 不合理的值 通过封装屏蔽掉不合理的值,这里只对成员属性进行读取器的封装。
        [cat2 setAge:-10];
        //cat2.age=100;
        NSLog(@"cat2 age=%d",[cat2 age]);
        
        
    }
    return 0;
}


四输出

2014-10-12 21:31:35.799 继承和多态[496:303] cat1 age=10
2014-10-12 21:31:35.800 继承和多态[496:303] cat2 age=0


你可能感兴趣的:(OC学习笔记十 封装)