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

上面的类将数字相加并返回总和。公共成员addNumgetTotal是与外界的接口,用户需要知道它们才能使用该类。私有成员总数是对外界隐藏的,但对于类的正常运行是必需的。

设计策略

我们大多数人都通过痛苦的经历学会了默认将类成员设为私有,除非我们确实需要公开它们。这就是很好的封装

了解数据封装非常重要,因为它是包括 Objective-C 在内的所有面向对象编程 (OOP) 语言的核心功能之一。