所有Objective-C程序都由以下两个基本要素组成 -
- 程序语句(代码) - 这是执行操作的程序的一部分,它们被称为方法(函数)。
- 程序数据 - 数据是受程序功能影响的程序信息。
封装是一种面向对象的编程概念,它将操作数据的数据和功能绑定在一起,并保护其免受外部干扰和误用。 数据封装导致了重要的OOP数据隐藏概念。
数据封装是捆绑数据和使用函数的机制,数据抽象是一种仅暴露接口并从用户隐藏实现细节的机制。
Objective-C通过创建用户定义类型(称为类)来支持封装和数据隐藏的属性。 例如 -
1 @interface Adder : NSObject { 2 NSInteger total; 3 } 4 5 - (id)initWithInitialNumber:(NSInteger)initialNumber; 6 - (void)addNumber:(NSInteger)newNumber; 7 - (NSInteger)getTotal; 8 9 @end
变量total
是私有的,因此无法从类外部访问。只能由Adder
类的其他成员访问它们,而不能由程序的任何其他部分访问。这是实现封装的一种方式。
接口文件中的方法是可访问的,并且在范围内是公共的。
有一些私有方法,这些方法是在扩展的帮助下编写的,我们将在后面的章节中学习。
1. 数据封装示例
任何使用公共和私有成员变量实现类的Objective-C程序都是数据封装和数据抽象的一个例子。 考虑以下示例 -
1 #import <Foundation/Foundation.h> 2 3 @interface Adder : NSObject { 4 NSInteger total; 5 } 6 7 - (id)initWithInitialNumber:(NSInteger)initialNumber; 8 - (void)addNumber:(NSInteger)newNumber; 9 - (NSInteger)getTotal; 10 11 @end 12 13 @implementation Adder 14 -(id)initWithInitialNumber:(NSInteger)initialNumber { 15 total = initialNumber; 16 return self; 17 } 18 19 - (void)addNumber:(NSInteger)newNumber { 20 total = total + newNumber; 21 } 22 23 - (NSInteger)getTotal { 24 return total; 25 } 26 27 @end 28 29 int main(int argc, const char * argv[]) { 30 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 31 Adder *adder = [[Adder alloc]initWithInitialNumber:10]; 32 [adder addNumber:15]; 33 [adder addNumber:14]; 34 35 NSLog(@"The total is %ld",[adder getTotal]); 36 [pool drain]; 37 return 0; 38 }
执行上面示例代码,得到以下结果:
2018-11-16 02:19:46.326 main[52227] The total is 39
上面的类将数字值相加并返回总和。 公共成员addNum
和getTotal
是外部接口,用户需要知道它们才能使用该类。 私有成员total
是对外界隐藏的东西,但是此类需要正常运作。
2. 设计策略
除非真的需要公开它们,否则大多数人都会通过经验来学习默认情况下将类成员设为私有。 这只是很好的封装。
了解数据封装非常重要,因为它是所有面向对象编程(OOP)语言(包括Objective-C)的核心功能之一。