oc三天


實例變量默認只允許被當前類的對象方法來訪問. 在 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 方法的名字需要與實例變量名同名(無下劃線)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章