『iOS開發』「OC」03 - 封裝

來源:互聯網
上載者:User

標籤:

一、物件導向和封裝

  物件導向的三大特性:封裝(成員變數)、繼承和多態

  在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 - 封裝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.