数据封装(Data Encapsulation)
优质
小牛编辑
146浏览
2023-12-01
所有Objective-C计划都由以下两个基本要素组成 -
Program statements (code) - 这是执行操作的程序的一部分,它们被称为方法。
Program data - 数据是受程序功能影响的程序信息。
封装是一种面向对象的编程概念,它将操作数据的数据和功能绑定在一起,并保护其免受外部干扰和误用。 数据封装导致了重要的OOP data hiding概念。
Data encapsulation是捆绑数据和使用它们的函数的机制, data abstraction是一种仅暴露接口并从用户隐藏实现细节的机制。
Objective-C通过创建用户定义类型(称为classes支持封装和数据隐藏的属性。 例如 -
@interface Adder : NSObject {
NSInteger total;
}
- (id)initWithInitialNumber:(NSInteger)initialNumber;
- (void)addNumber:(NSInteger)newNumber;
- (NSInteger)getTotal;
@end
变量total是私有的,我们无法从类外部访问。 这意味着只能由Adder类的其他成员访问它们,而不能由程序的任何其他部分访问。 这是实现封装的一种方式。
接口文件中的方法是可访问的,并且在范围内是公共的。
有一些私有方法,这些方法是在extensions的帮助下编写的,我们将在后面的章节中学习。
数据封装示例
任何使用公共和私有成员变量实现类的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是对外界隐藏的东西,但是课程需要正常运作。
设计策略
除非我们真的需要公开它们,否则我们大多数人都会通过痛苦的经验来学习默认情况下将类成员设为私有。 这只是很好的encapsulation 。
了解数据封装非常重要,因为它是所有面向对象编程(OOP)语言(包括Objective-C)的核心功能之一。