所有Objective-C程式都由以下兩個基本要素組成 -
封裝是一種物件導向的程式設計概念,它將運算元據的資料和功能系結在一起,並保護其免受外部干擾和誤用。 資料封裝導致了重要的OOP資料隱藏概念。
資料封裝是綑綁資料和使用函式的機制,資料抽象是一種僅暴露介面並從使用者隱藏實現細節的機制。
Objective-C通過建立使用者定義型別(稱為類)來支援封裝和資料隱藏的屬性。 例如 -
@interface Adder : NSObject {
NSInteger total;
}
- (id)initWithInitialNumber:(NSInteger)initialNumber;
- (void)addNumber:(NSInteger)newNumber;
- (NSInteger)getTotal;
@end
變數total
是私有的,因此無法從類外部存取。只能由Adder
類的其他成員存取它們,而不能由程式的任何其他部分存取。這是實現封裝的一種方式。
介面檔案中的方法是可存取的,並且在範圍內是公共的。
有一些私有方法,這些方法是在擴充套件的幫助下編寫的,我們將在後面的章節中學習。
任何使用公共和私有成員變數實現類的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:15];
[adder addNumber:14];
NSLog(@"The total is %ld",[adder getTotal]);
[pool drain];
return 0;
}
執行上面範例程式碼,得到以下結果:
2018-11-16 02:19:46.326 main[52227] The total is 39
上面的類將數位值相加並返回總和。 公共成員addNum
和getTotal
是外部介面,使用者需要知道它們才能使用該類。 私有成員total
是對外界隱藏的東西,但是此類需要正常運作。
除非真的需要公開它們,否則大多數人都會通過經驗來學習預設情況下將類成員設為私有。 這只是很好的封裝。
了解資料封裝非常重要,因為它是所有物件導向程式設計(OOP)語言(包括Objective-C)的核心功能之一。