黑马程序员——OC中的封装

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———

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 
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 
#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 
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)可以和一些其他的局部变量区分开来,下划线开头 的变量,通常都是类的成员变量。 



你可能感兴趣的:(移动开发)