實例變量默認只允許被當前類的對象方法來訪問. 在 OC 中, 基於面向對象討論封裝是指爲實例變量進行封裝. 而在實際討論封裝性時, 概念會更加寬泛一些.
例如現在有一個"射擊"的例子. 有一個搶的類(Gun), 裏面提供子彈的個數的成員變量
提供一個射擊的方法, 每次射擊子彈會減少
1, 新建一個項目, 添加 Gun 類的具體實現
@interface Gun : NSObject {
@public
int _bulletCount;
}
- (void)shoot;
@end
@implementation Gun
- (void)shoot {
_bulletCount--;
NSLog(@"buibuibui... 還剩 %d 發子彈", _bulletCount);
}
@end
2, 添加 main 函數代碼
int main(int argc, const char * argv[]) {
@autoreleasepool {
Gun *gun = [Gun new];
gun->_bulletCount = 3;
[gun shoot];
[gun shoot];
[gun shoot];
[gun shoot];
[gun shoot];
}
return 0;
}
3, 最後得到結論
這裏不合理. 子彈需要被約束, 另外也不能初始化負數. 因此提供方法 setBulletCount
修改 Gun 類中的代碼
@interface Gun : NSObject {
@public
int _bulletCount;
}
- (void)shoot;
- (void)setBulletCount:(int)count;
@end
@implementation Gun
- (void)shoot {
if (_bulletCount > 0) {
_bulletCount--;
NSLog(@"buibuibui... 還剩 %d 發子彈", _bulletCount);
} else {
NSLog(@"沒有子彈...");
}
}
- (void)setBulletCount:(int)count {
if (count > 0) {
_bulletCount = count;
}
}
@end
main 函數中的使用也需要調整
int main(int argc, const char * argv[]) {
@autoreleasepool {
Gun *gun = [Gun new];
[gun setBulletCount:3];
[gun shoot];
[gun shoot];
[gun shoot];
[gun shoot];
[gun shoot];
}
return 0;
}
1, 所謂的封裝
在 OC 中進行封裝, 就是實現設置實例變量和獲取實例變量數據的方法, 常常稱爲 setter 方法和 getter 方法.
2, setter 方法
setter 方法又叫設置器, 是爲實例變量對外提供的統一訪問規則, 用於設置實例變量的值. 一般在開發中, 禁止將實例變量直接暴露到外面. 通過 setter 方法可以爲賦值操作進行必要的控制與篩選. 起到了封裝和控制的作用.
規則:
1)方法名必須以 set 開頭, 然後跟上實例變量的名字(無下劃線)
2)使用駱駝命名規則
3) 接收一個參數, 用於爲實例變量初始化
4)返回 void 類型
5)setter 是實例方法
3, getter 方法
getter 方法又叫讀取器, 是用來在外訪問成員變量的統一方法.
規則:
1)getter 返回與相關成員變量一致的類型數據
2)getter 沒有參數
3)getter 方法的名字需要與實例變量名同名(無下劃線)