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类的其他成员访问,而不能由程序的任何其他部分访问。这是实现封装的一种方式。接口文件中的方法可以访问,并且在作用域内是公共的。有一些私有方法,这些方法是在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;
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    2020-08-21 08:46:23.205 helloWorld[8508:12704] The total is 19
    
    上面的类将数字相加并返回总和。公共成员addNum和getTotal是与外界的接口,用户需要了解它们才能使用该类。私有成员总数是对外界隐藏的东西,但对于类正常运转而言是必需的。
  • 设计策略

    除非我们真的需要公开他们,否则我们大多数人都通过痛苦的经验中学到了如何使类成员默认为私有的。那只是很好的封装。了解数据封装非常重要,因为它是所有包括Object-C的面向对象编程(OOP)语言的核心功能之一。