1、要进行封装的原因
不进行封装的缺点: 当一个类把自己的属性暴露给外部的时候,那么该类就失去对属性的管理权 。将数据隐藏起来,只能用此类的方法函数才可以访问或者设置数据,不可被外部任意存储是面向 对象设计本质。降低了数据被无用的可能性!
在OC语言中,使用@interface和@implementation来处理类。
@interface就好像暴露在外面的时钟表面,像外界提供展示以及接口。
@implementation就好像隐 藏在时钟内部的构造实现,把具体的实现封装了起来。
2、封装的原理
实例变量默认只能被当前类的对象方法访问。
3、封装的步骤
定义设置实例变量(setter)方法和访问实例变量(getter)的方法
1)setter方法(设置器)
在开发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public、 @protected等关键字修饰,而是使用Set方法来为对象提供成员变量的值。在set方法的内部也可 以对一些不合理的赋值进行筛选过滤。
Set方法的作用:为外界提供一个设置成员变量值的方法 。
命名规范:
(1)方法名必须以set开头
(2)set后面跟上成员变量的名称,首字母大写
(3)返回值一定是void
(4)一定要接收一个参数,而且参数类型需要和成员变量的类型一致
(5)形参名不能和成员变量名一样(苹果官方推荐成员变量名前加_以示区分)
(6)set方法一定是一个对象方法
set方法实现中,一定要用形参给实例变量赋值
set方法的好处:
(1)不让数据暴露在外,保证了数据的安全性
(2)对设置的数据进行过滤
set方法的声明:
#import <Foundation/Foundation.h>
typedef enum {sexMan,sexWoman} Sex;
@interface Person : NSObject
{
//这里不用再使用关键字@public
NSString *_name;
int _age;
Sex _sex;
float _height;
}
//给每个实例变量定义变量设置两个方法:设置变量的方法(set) 获取变量值的方法(get)
-(void)setName:(NSString *)name;
-(void)setAge:(int) age;
-(void)setSex:(Sex) sex;
-(void)setHeight:(float) height;
@end
set方法的实现:
set方法实现中,一定要用形参给实例变量赋值
#import "Person.h"
@implementation Person
-(void)setName:(NSString *)name{
_name=name;
}
-(void)setAge:(int) age{
_age=age;
}
-(void)setSex:(Sex) sex{
_sex=sex;
}
-(void)setHeight:(float) height{
_height=height;
}
@end
测试程序:
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p=[Person new];
[p setName:@"小红"];
}
return 0;
}
2)getter方法(访问器)
Get方法的作用:为调用者返回对象内部的成员变量 。
命名规范:
(1)一定有返回值,返回值的类型和成员变量的类型一致
(2)方法名是成员变量名去掉下划线
(3)不需要接收任何参数 Get方法的声明
(4)get方法一定是一个对象方法
(5)get方法一定没有参数
#import <Foundation/Foundation.h>
typedef enum {sexMan,sexWoman} Sex;
@interface Person : NSObject
{
//这里不用再使用关键字@public
NSString *_name;
int _age;
Sex _sex;
float _height;
}
//给每个实例变量定义变量设置两个方法:设置变量的方法(set) 获取变量值的方法(get)
-(NSString *)name;
-(int)age;
-(Sex)sex;
-(float)height;
@end
get方法的实现:
#import "Person.h"
@implementation Person
-(NSString *)name{
return _name;
}
-(int)age{
return _age;
}
-(Sex)sex{
return _sex;
}
-(float)height{
return _height;
}
@end
3)注意
(1)在实际的开发中,不一定set和get方法都会提供,如果内部的成员变量比如学生的学号这样 的数据只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set方法。
(2)成员变量名的命名以下划线开头,get方法名不需要带下划线,使用下划线开头有两个好 处:1)与get方法的方法名区分开来;2)可以和一些其他的局部变量区分开来,下划线开头 的变量,通常都是类的成员变量。
本文深入讲解面向对象编程中的封装概念,包括其原因、原理及具体实施步骤,通过Objective-C示例代码展示了如何定义setter和getter方法来保护和访问类的成员变量。
1921

被折叠的 条评论
为什么被折叠?



