Objective-C 数据封装
所有 Objective-C 程序都由以下两个基本元素组成 −
程序语句(代码) − 这是执行操作的程序的一部分,它们被称为方法。
程序数据 − 数据是程序的信息,受程序功能的影响。
封装是一种面向对象的编程概念,它将数据和操作数据的函数绑定在一起,并确保两者免受外部干扰和误用。 数据封装导致了重要的 OOP 概念数据隐藏。
数据封装 是一种将数据和使用它们的函数捆绑在一起的机制,而 数据抽象 是一种只公开接口并向用户隐藏实现细节的机制。
Objective-C 通过创建用户定义的类型(称为类)来支持封装和数据隐藏的特性。 例如 −
@interface Adder : NSObject {
NSInteger total;
}
- (id)initWithInitialNumber:(NSInteger)initialNumber;
- (void)addNumber:(NSInteger)newNumber;
- (NSInteger)getTotal;
@end
变量 total 是私有的,我们不能从类外访问。 这意味着它们只能由 Adder 类的其他成员访问,而不能由程序的任何其他部分访问。 这是实现封装的一种方式。
接口文件中的方法是可访问的,并且在范围内是公共的。
有私有方法,它们是在扩展的帮助下编写的,我们将在接下来的章节中学习。
数据封装示例
任何使用公共和私有成员变量实现类的 Objective-C 程序都是数据封装和数据抽象的示例。 考虑以下示例 −
#import <Foundation/Foundation.h>
@interface Adder : NSObject {
NSInteger total;
}
- (id)initWithInitialNumber:(NSInteger)initialNumber;
- (void)addNumber:(NSInteger)newNumber;
- (NSInteger)getTotal;
@end
@implementation Adder
-(id)initWithInitialNumber:(NSInteger)initialNumber {
total = initialNumber;
return self;
}
- (void)addNumber:(NSInteger)newNumber {
total = total + newNumber;
}
- (NSInteger)getTotal {
return total;
}
@end
int main(int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Adder *adder = [[Adder alloc]initWithInitialNumber:10];
[adder addNumber:5];
[adder addNumber:4];
NSLog(@"The total is %ld",[adder getTotal]);
[pool drain];
return 0;
}
当上面的代码被编译和执行时,会产生如下结果 −
2013-09-22 21:17:30.485 DataEncapsulation[317:303] The total is 19
上面的类将数字相加并返回总和。 公共成员 addNum 和 getTotal 是与外界的接口,用户需要知道它们才能使用该类。 私有成员 total 是对外界隐藏的东西,但需要类才能正常运行。
设计策略
我们中的大多数人都通过痛苦的经验了解到,默认情况下将类成员设置为私有,除非我们真的需要公开它们。 这就是很好的封装。
了解数据封装很重要,因为它是包括 Objective-C 在内的所有面向对象编程 (OOP) 语言的核心功能之一。

