Objective-C 封装(Encapsulation)

所有 Objective-C 程序都由以下两个基本元素组成:

  • 程序语句(代码)- 这是程序中执行操作的部分,这些操作称为方法。
  • 程序数据 - 数据是受程序功能影响的程序信息。

封装是一种面向对象的编程概念,它将数据和操作数据的函数绑定在一起,并使它们免受外部干扰和误用。数据封装解释了 数据隐藏 这一重要的面向对象概念。

数据封装是一种捆绑数据和使用数据的函数的机制,数据抽象是一种仅公开接口并向用户隐藏实现细节的机制。

Objective-C 通过创建称为 (class)的用户定义类型来支持封装和数据隐藏的特性。例如:

  1. @interface Adder : NSObject {
  2. NSInteger total;
  3. }
  4. - (id)initWithInitialNumber:(NSInteger)initialNumber;
  5. - (void)addNumber:(NSInteger)newNumber;
  6. - (NSInteger)getTotal;
  7. @end

变量 total 是私有的,我们无法从类外访问。这意味着它们只能由加法器类的其他成员访问,而不能由程序的任何其他部分访问。这是实现封装的一种方法。

接口文件中的方法是可访问的,并且在范围内是公共的。还有一些私有方法,它们是在 extensions(扩展) 的帮助下编写的,我们将在接下来的章节中学习。


数据封装实例

任何使用公共和私有成员变量实现类的 Objective-C 程序都是数据封装和数据抽象的实例。

参考以下实例:

  1. #import <Foundation/Foundation.h>
  2. @interface Adder : NSObject {
  3. NSInteger total;
  4. }
  5. - (id)initWithInitialNumber:(NSInteger)initialNumber;
  6. - (void)addNumber:(NSInteger)newNumber;
  7. - (NSInteger)getTotal;
  8. @end
  9. @implementation Adder
  10. -(id)initWithInitialNumber:(NSInteger)initialNumber {
  11. total = initialNumber;
  12. return self;
  13. }
  14. - (void)addNumber:(NSInteger)newNumber {
  15. total = total + newNumber;
  16. }
  17. - (NSInteger)getTotal {
  18. return total;
  19. }
  20. @end
  21. int main(int argc, const char * argv[]) {
  22. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  23. Adder *adder = [[Adder alloc]initWithInitialNumber:10];
  24. [adder addNumber:5];
  25. [adder addNumber:4];
  26. NSLog(@"The total is %ld",[adder getTotal]);
  27. [pool drain];
  28. return 0;
  29. }

结果如下:

  1. 2022-07-07 21:17:30.485 DataEncapsulation[317:303] The total is 19

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


设计经验

我们中的大多数人都从很多经验中总结,除非我们真的需要公开他们,否则在默认情况下会让类成员成为私有。这就是一个很好的 封装

理解数据封装很重要,因为它是所有面向对象编程(OOP)语言(包括 Objective-C)的核心特性之一。