面向物件 C 資料封裝



所有面向物件 C 程式都由以下兩個基本元素組成 −

  • 程式語句(程式碼) − 這是程式執行操作的部分,稱為方法。

  • 程式資料 − 資料是受程式函式影響的程式資訊。

封裝是一種面向物件程式設計概念,將資料和用於處理資料的函式捆綁在一起,並保護它們免受外部干擾和誤用。資料封裝促成了 資料隱藏 這個重要的 OOP 概念。

資料封裝 是將資料與其使用函式捆綁在一起的一種機制,而 資料抽象 是一種僅公開介面並向用戶隱藏實施細節的機制。

面向物件 C 透過建立稱為 的使用者定義型別來支援封裝和資料隱藏特性。例如 −

@interface Adder : NSObject {
   NSInteger total;
}

- (id)initWithInitialNumber:(NSInteger)initialNumber;
- (void)addNumber:(NSInteger)newNumber;
- (NSInteger)getTotal;

@end

變數 total 是私有變數,我們無法從該類外部進行訪問。這意味著它們只能由 Adder 類其他成員訪問,不能由程式的任何其他部分訪問。這是實現封裝的一種方式。

介面檔案內的函式可以訪問且其作用域是公共的。

還有私有方法,透過 擴充套件 編寫,我們將在下一章節中進行了解。

資料封裝示例

任何實施了公共和私有成員變數的類的面向物件 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 是對外界的介面,使用者需要了解這些接口才能使用該類。私有成員 total 是對外界隱藏的,但類需要它來正常執行。

設計策略

我們大多數人透過慘痛的教訓瞭解到,除非我們真的需要公開類成員,否則應預設將其設為私有。那才是好的 封裝

瞭解資料封裝很重要,因為它是面向物件程式設計 (OOP) 語言的一個核心特性,面向物件 C 也包括在內。

廣告