——- ios培训、ios培训、期待与您交流! ———-
封装的实质
是指隐藏对象的属性和实现细节,对外提供公共访问方式,封装是一种思想.
方法默认就是用了封装的思想.
属性有两种方式操作:
1直接操作.public
2.封装操作:通过给外部暴露两个方法:set方法用于设置值.get方法用于获取值.
一个属性的set与get方法不是必须的,看情况,如果你希望让外部调用者可以设置值,
则你就给定义set方法.如果你希望外部能获取值,就定义get方法.
一切看需求.
封装的好处:
• 将变化隔离。 • 便于使用。 • 提高重用性。 • 提高安全性。
封装原则:
• 将不需要对外提供的内容都隐藏起来。
• 把属性都隐藏,提供公共方法对其访问。
代码体现:
#import <Foundation/Foundation.h>
@interface Person : NSObject{
//@public 表示这个属性能被外部直接访问.
/*
属性命名规范:
属性名以_开头.
以便于与参数区分.同时.便于与局部变量区别.
*/
char *_name;
int _age;
}
-(void) smile;
/*
规范:
1.不能有返回值.
2.必须有参数,且参数类型与属性类型一致.
3.参数名不能与属性名一致
4.set+属性名:首字母大写(驼峰命名)
作用:就是给属性(成员变量)去赋值
*/
-(void) setAge:(int) age;
/*
规范:
1.必须有返回值.
2.不能有参数.
3.返回值类型必须跟属性类型一致.
4.get+属性名:首字母大写(驼峰命名)
作用:就是把属性值传递给调用者.
*/
-(int) getAge;
@end
@implementation Person
-(void) smile{
NSLog(@"%s笑了--年龄是:%d",_name,_age);
}
-(void) setAge:(int) age{
if(age<=0){
_age=1;
}else{
_age=age;
}
//NSLog(@"当前的年龄是:%d",age);
}
-(int) getAge{
return _age;
}
@end
int main(){
Person *p=[Person new];
// [p smile];
// p->name="fred";
//public的方式,外部拿到对象可以直接操作对象的属性,没有限制.
// p->age=-100;
//用封装的方式去设置值
[p setAge:100];
//用封装的方式去获取值.
//NSLog(@"当前的年龄是:%d",[p getAge]);
[p smile];
return 0;
}
关于封装的一些思考:属性默认的方式是@protected,假如不通过封装,而是把属性的访问方式改为@pubulic,这样外部的对象可以任意操作属性,比如可以让年龄设置为-1,这明显是不符合逻辑的,所以我们需要把属性封装起来,限制给属性的赋值.这就是常用的设置器(set方法),对应的,如果想要获取某一个属性的值,需要设置一个接收器(get方法),这样就保证了属性赋值的安全型,而且其他对象想要操作封装的属性的时候也可以直接调用以上两个方法,提高了效率.
类方法封装
好处: 不需要创建对象,可以直接通过类名调用的方法,称为类方法.
作用:调用方便.执行效率高.在定义方法的时候尽量用类方法.
类方法不能使用属性–局限性.
注意:定义方法时:到底是用类方法还是对象看在方法里是否要用到属性.如果要用到属性则用对象方法.反之,用类方法.
#import <Foundation/Foundation.h>
@interface Person : NSObject{
char *_name;
}
-(void)setName:(char *)name;
-(void)smile;
+(void)smile;
+(void)haha:(char *)str;
@end
@implementation Person
-(void)setName:(char *)name{
_name=name;
}
//这里是对象方法:可以直接调用属性
-(void)smile{
NSLog(@"哈哈..很开心..%s",_name);
}
//这里是类方法:不可以直接访问属性
+(void)smile{
NSLog(@"呼呼..很开心..");
}
//这里也是个类方法,不可以*直接*访问属性,但是可以先把属性当做参数传进去,然后在方法里面使用属性.
+(void)haha:(char *)str{
// NSLog(@"haha..很开心..%s",name);
}
@end
int main(){
Person *p=[Person new];
[p setName:"fred"];//对象调用对象方法
[p smile];
[Person haha:"heihei"];//类调用类方法
[Person smile];
return 0;
}