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 |
|