標籤:
一、物件導向和封裝
物件導向的三大特性:封裝(成員變數)、繼承和多態
在OC語言中,使用@interface和@implementation來處理類。
@interface就好像暴露在外面的時鐘錶面,像外界提供展示以及介面。@implementation就好像隱藏在時鐘內部的構造實現,把具體的實現封裝了起來。
二、set方法
在開發過程中,考慮到安全性要求,我們一般不在成員變數名前面使用@public、@protected等關鍵字修飾,而是使用Set方法來為對象提供成員變數的值。在set方法的內部也可以對一些不合理的賦值進行篩選過濾。
set方法的作用:為外界提供一個設定成員變數值的方法
命名規範:
(1)方法名必須以set開頭
(2)set後面跟上成員變數的名稱,首字母大寫
(3)傳回值一定是void
(4)一定要接收一個參數,而且參數類型需要和成員變數的類型一致
(5)形參名不能喝成員變數名一樣(蘋果官方推薦成員變數名前加_以示區分)
Set方法的好處:
(1)不讓資料暴露在外,保證了資料的安全性
(2)對設定的資料進行過濾
三、get方法
get方法的作用:為調用者返回對象內部的成員變數
命名規範:
(1)一定有傳回值,傳回值的類型和成員變數的類型一致
(2)方法名和成員變數名一樣
(3)不需要接收任何參數
使用樣本:
方法的聲明:
1 #import <Foundation/Foundation.h> 2 @interface Student : NSObject 3 { 4 // 成員變數盡量不要用@public 5 // @public 6 int _age; 7 8 // 唯讀(readonly):只允許外界訪問no,不允許外界修改no。 9 // @public10 int _no;// 只需要提供get方法11 }12 13 - (void)setAge : (int)newAge;14 15 - (int)age;16 17 // 學習18 - (void)study;19 20 @end
方法的實現:
#import "Student.h"@implementation Student// set方法的實現- (void)setAge : (int)newAge{ // 對傳進來的參數進行過濾 if (newAge <= 0){ newAge = 1; } _age = newAge;}// get方法- (int)age{ return _age;}- (void)study{ NSLog(@"%d歲的學生正在學習",age);}@end
主函數:
1 #import <Foundation/Foundation.h> 2 #import "Student.h" 3 4 int main() 5 { 6 Student *stu = [Student new]; 7 8 // stu->age = 10; 9 10 [stu setAge : 10];11 12 [stu study];13 14 NSLog(@"學生的年齡是%d歲",[stu _age]);15 16 return 0;17 }
注1:在實際的開發中,不一定set和get方法都會提供,如果內部的成員變數比如學生的學號這樣的資料只允許外界讀取,但是不允許修改的情況,則通常只提供get方法而不提供set方法。
注2:成員變數名的命名以底線開頭,get方法名不需要帶底線,使用底線開頭有兩個好處:(1)與get方法的方法名區分開來;(2)可以喝一些其他的局部變數區分開來,底線開頭的變數,通常都是類的成員變數。
四、類方法
直接可以用類名來執行的方法(類本身會在記憶體中佔據儲存空間,裡面有類\對象方法列表)
類方法和對象方法對比:
(1)對象方法
- 以減號-開頭
- 只能讓對象調用,沒有對象,這個方法根本不可能被執行
- 對象方法能訪問執行個體變數(成員變數)
(2)類方法
- 以加號+開頭
- 只能用類名調用,對象不能調用
- 類方法中不能訪問執行個體變數(成員變數)
- 使用場合:當不需要訪問成員變數的時候,盡量用類方法
(3)類方法和對象方法可以同名
五、self關鍵字
self是一個指標,誰調用了當前方法,self就指向誰
【出現在對象方法中,就代表著當前對象,出現在類方法中,就代表著當前類】
self的用途:
(1)可以利用self->成員變數名訪問當前對象內部的成員變數(僅在對象方法中)
(2)[self 方法名];可以調用其他的對象方法或者是類方法
六、封裝練習
設計一個成績類
代碼:
1 /* 2 4.設計一個成績類 3 * C語言成績(可讀可寫) 4 * OC成績(可讀可寫) 5 * 總分(唯讀) 6 * 平均分(唯讀) 7 */ 8 #import <Foundation/Foundation.h> 9 10 @interface Score : NSObject11 {12 int _cScore; // C語言成績13 int _ocScore; // OC成績14 15 int _totalScore;// 總分16 int _averageScoe; // 平均分17 }18 19 - (void)setCScore:(int)cScore;20 - (int)cScore;21 22 - (void)setOcScore:(int)ocScore;23 - (int)ocScore;24 25 - (int)totalScore;26 - (int)averageScore;27 28 @end29 30 @implementation Score31 - (void)setCScore:(int)cScore32 {33 _cScore = cScore;34 35 // 計算總分36 _totalScore = _cScore + _ocScore;37 _averageScoe = _totalScore/2;38 }39 - (int)cScore40 {41 return _cScore;42 }43 44 - (void)setOcScore:(int)ocScore45 {46 _ocScore = ocScore;47 48 // 計算總分49 _totalScore = _cScore + _ocScore;50 _averageScoe = _totalScore/2;51 }52 // 監聽成員變數的改變53 54 - (int)ocScore55 {56 return _ocScore;57 }58 59 - (int)totalScore60 {61 return _totalScore;62 }63 - (int)averageScore64 {65 return _averageScoe;66 }67 @end68 69 70 int main()71 {72 Score *s = [Score new];73 74 [s setCScore:90];75 [s setOcScore:100];76 77 [s setCScore:80];78 79 80 int a = [s totalScore];81 82 NSLog(@"總分:%d", a);83 84 return 0;85 }
『iOS開發』「OC」03 - 封裝