一、面向对象封装
顾名思义,封装就是把相关的属性包装起来,用的时候直接用这个包裹起来的东西就行了,更加接近人类的思考方式,只需要关注对象,不需要关注步骤。还是代码演示把。
1)要理解封装,首先要理解和运用set和get方法,set方法的作用就是用来设置成员变量,可以在方法里面过滤掉一些不合理的值;get方法的作用是放回对象内部的成员变量。
2)实例中来说明。我还是在以前的例子上面进行修改。
#import<Foundation/Foundation.h>
@interface Person : NSObject
{
int _height;
int _weight;
int _face;//颜值
}
//set方法
-(void)setHeight:(int)height;
-(void)setWeight:(int)weight;
-(void)setFace:(int)face;
//get方法
-(int)height;
-(int)weight;
-(int)face;
//-(void)cook;//做饭
//-(void)wash;//洗衣服
@end
@implementation Person
//set方法的实现
-(void)setHeight:(int)height
{
_height=height;
}
-(void)setWeight:(int)weight
{
_weight=weight;
}
-(void)setFace:(int)face
{
_face=face;
}
//get方法的实现
-(int)height
{
return _height;
}
-(int)weight
{
return _weight;
}
-(int)face
{
return _face;
}
//-(void)cook
//{
// NSLog(@"身高为%i,体重为%i,颜值为%i,做饭",height,weight,face);
//}
//-(void)wash
//{
// NSLog(@"身高为%i,体重为%i,颜值为%i,洗衣服",height,weight,face);
//}
@end
int main()
{
Person *Myself =[Person new];
[Myself setHeight:200];
[Myself setWeight:150];
[Myself setFace:300];
NSLog(@"身高为:%i,体重为:%i,颜值为:%i",[Myself height],[Myself weight],[Myself face]);
return 0;
}
在代码中,我将Person类中的属性身高height,体重weight,颜值face用set方法封装好了,到时候调用时就直接用get方法获取就可以了。
3)运行结果
从运行结果可以看出封装的内容已经显示出现了。
4)现在再来谈谈封装的好处。
1.可以过滤不合理的值,例如可以在set方法中加入一些判断语句进行筛选。
2.屏蔽内部赋值的过程。
3.让外部不必关注内部的细节。
二、类方法
到目前为止,在oc中能用的方法是以-开头的。其实还有一种是以+开头的,这种就叫做类方法,类方法可以直接用类名来执行方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)。
1)实例
#import<Foundation/Foundation.h>
@interface Musician :NSObject
{
int _num;
}
-(void)playPiano;
+(void)playPiano;
-(void)setNum:(int)num;//set get 方法
-(int)num;
@end
@implementation Musician
-(void)setNum:(int)num
{
_num=num;
}
-(int)num
{
return _num;
}
-(void)playPiano
{
NSLog(@"%i号钢琴师弹奏钢琴",_num);
[Musician playPiano];//对象方法可以调用类方法
}
+(void)playPiano
{
NSLog(@"这是类方法");
}
@end
int main()
{
Musician *m =[Musician new];
[m setNum:10];
[m playPiano];//对象方法
[Musician playPiano];//类方法
return 0;
}
在这里我定义了一个Musician的类,里面有playPiano的对象方法和类方法,这说明对象方法和类方法名字可以是一样的。并且对象方法可以调用类方法,看运行结果。
2)运行结果
图中第一条”这是类方法“是对象调用类方法中得到的。
3)注意的事项
对象方法
1 减号 - 开头
2 只能由对象来调用
3 对象方法中能访问当前对象的成员变量(实例变量)
类方法
1 加号 + 开头
2 只能由类(名)来调用
3 类方法中不能访问成员变量(实例变量)