面向对象(隐藏和封装)

来源:互联网 发布:国外域名注册 知乎 编辑:程序博客网 时间:2024/05/24 07:05

    • 面向对象隐藏和封装
    • 理解封装
    • 使用访问控制符
    • 合成存取方法

面向对象(隐藏和封装)

理解封装

封装是面向对象程序语言对客观世界的模拟,在客观世界中对象的成员变量(用于描述对象的状态数据)都被隐藏在对象内部,外部无法直接操作和修改。
对一个类或对象实现良好的封装,可以实现以下目的。

 - 隐藏类的实现细节 - 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问。 - 可进行数据检查,从而有利于保证对象信息的完整性。 - 便于修改,提高代码的可维护性。

为了实现良好的封装,需要从以下两个方面考虑

 - 将对象的成员变量和实现细节隐藏起来,不允许外部直接访问。 - 把方法暴露出来,让方法来控制对这些成员变量进行安全的访问操作。

使用访问控制符

Objective-C提供了4个访问控制符:@private、@package、@protected和@public,分别代表4个访问控制级别。

 - @private(当前类访问权限):如果类的成员变量使用@private访问控制符来限制,则这个成员变量只能在当前类的内部访问。很显然,这个访问控制符用于彻底隐藏成员变量。在类的实现部分定义的成员变量相当于默认使用这种访问权限。 - @package(相同映像访问权限):如果类的成员变量使用@package访问控制符来限制,则这个成员变量可以在当前类以及当前类的同一个映像的任意地方访问。很显然,这个访问控制符用于部分隐藏成员变量。 - @protected(子类访问权限):如果类的成员变量使用@protected访问控制符来限制,则这个成员变量可以在当前类、当前类的子类的任意地方访问。很显然,这个访问控制符用于部分暴露成员变量。在类的接口部分定义的成员变量默认使用这种访问权限。 - @public(公共访问权限):这是一个最宽松的访问控制级别,如果类的成员变量使用@public限制,那么这个成员变量可以在任意地方访问,不管是否处于同一映像中,也不管是否具有父子继承关系。
    一个类常常就是一个小的模块,应该只让这个模块公开必须让外界知道的内容,而隐藏其他一切内容。设计程序时,应尽量避免一个模块直接操作和访问另一个模块的数据,模块设计追求搞内聚(尽可能把模块的内部数据、功能实现细节隐藏在模块内部独立完成,不允许外部直接干预)、低耦合(仅暴露少量的方法给外部使用)。

关于访问控制符的使用,存在如下几条基本原则。

 - 类里的绝大部分成员变量都应该使用@private限制。除此之外,有些方法只适用于辅助实现该类的其他方法,这些方法被称为工具方法,这些工具方法也应该隐藏在该类的内部,此时就应该把这些方法定义在类实现部分。 - 如果某个类要作为其他类的父类,该类里包含的成员变量希望被子类访问,则可考虑使用@protected限制这些成员变量。 - 希望暴露出来给其他类自由调用的方法应该现在类接口部分定义,然后在类实现部分实现它们。

合成存取方法

让系统自动合成setter和getter方法只需要如下两步

 1. 在类接口部分使用@property指令定义属性。使用@property定义属性时无需放在类接口部分的花括号里,而是直接放在@interface@end之间定义。@property指令放在属性定义的最前面。 2. 此步是可选的。如果程序需要改变getter、setter方法对应的成员变量的变量名,则可在类实现部分使用@synthesize指令。例:在.h文件中定义@property (nonatomic) NSString * name;@property NSString * pass;@property NSDate * birth;在.m文件中定义//为三个property合成setter和getter方法//指定name property底层对应的成员变量名为_name,这行代码可以省略@synthesize name = _name;@synthesize pass;@synthesize birth;//实现自定义的setName:方法,添加自己的控制逻辑- (void) setName:(NSString *)name{    self->_name = [NSString stringWithFormat:@"+++%@",name];}

在使用指示符时还可在指示符和类型之间用括号添加一些额外的指示符,可使用特殊指示符如下。

 - assign:该指示符指定对属性只是进行简单赋值,不更改所赋的值的引用计数。这个指示符主要适用于NSInteger等基本类型,以及short、float、double、结构体等各种C数据类型。 - copy:如果使用copy指示符,那么当调用setter方法对成员变量赋值时,会将被赋值的对象复制一个副本,再将该副本赋值给成员变量。copy指示符会将原成员变量所引用对象的引用计数减1.当成员变量的类型时可变类型,或其子类是可变类型时,被赋值的对象有可能在赋值之后被修改,如果程序不需要这种修改影响setter方法设置的成员变量的值时,此时就可考虑使用copy指示符。 - getter、setter:这两个指示符用于为合成的getter、setter方法指定自定义方法名。例如:getter = abc。 - readonly、readwrite:readonly指示系统只合成getter方法,不再合成setter方法;readwrite是默认值,指示系统需要合成setter、getter方法。 - retain:使用retain指示符定义属性时,当把某个对象赋值给该属性时,该属性原来所引用的对象的计数减1,被赋值对象的引用计数加1。(启用ARC机制之后,很少使用了) - strong、weak:strong指示符指定该属性对被赋值对象持有强引用,而weak指示符指定该属性对被赋值对象持有弱引用。强引用的意思是,只要该强引用指向被赋值的对象,那么该对象就不会自动回收;弱引用的意思是,即使该弱引用指向被赋值的对象,该对象也可能被回收。
0 0
原创粉丝点击