詳解Objective-C學習筆記之物件導向編程

來源:互聯網
上載者:User

Objective-C學習筆記之物件導向編程是本文要介紹的內容,主要詳細的介紹了物件導向編程的內容,對於資深的C++程式員來說,物件導向編程不是什麼新鮮的概念,類、對象、執行個體、方法這些概念就不再冗述了。和上一篇 Objective-C學習中對 C語言的擴充一樣,這篇主要側重於Objective-C中的OOP,有哪些與我們熟識的C++不同的概念。

 
  1. Point : NSObject  
  2. {  
  3.   int X;  
  4.   int Y;  
  5. }  
  6. - (void) SetX: (int) X;  
  7. - (void) SetY: (int) Y;  
  8. - (void) Show;  
  9. // Point 

下面進行逐句分析。

“Point”告訴編譯器:“這是為名為Point的新類定義的介面。”,而後面的“NSObject”告訴編譯器,Point類是基於 NSObject類的。該語句表明每個Point類都是一個NSObject,並且每個Point都將繼承NSObject類定義的所有行為。

花括弧中的內容是用於大量建立新Point對象的模板。它表明,建立新Point對象時,該對象由兩個元素構成——X和Y,每個建立出來的Point類對象都將擁有自己的X和Y。

隨後的代碼看起來像是C函數原型,在Objective-C中,它們稱為方法聲明。方法聲明指出每種方法的名稱、方法傳回值的類型和某些參數。

前面的短線“-”表明這是Objective-C方法的聲明,這是一種區分函數原型與方法聲明的方式。

短線後面是方法的傳回型別,位於圓括弧中,void表示無傳回值。Objective-C方法可以返回與C函數相同的類型:標準類型整型、浮點型和字元型)、指標、對象引用和結構。

方法類型之後是方法名稱,如果方法使用參數,在名稱的結尾處需要使用冒號。這個冒號是名稱的一部分,它告訴編譯器後面會出現參數。

參數的類型是在圓括弧中指定的,緊隨其後的是參數名稱。

最後的“Point

 
  1. - (void) SetX: (int) thisX  
  2. {  
  3.   X = thisX;  
  4. } // SetX  
  5.  
  6. - (void) SetY: (int) thisY  
  7. {  
  8.   X = thisY;  
  9. } // SetY  
  10.  
  11. - (void) Show  
  12. {  
  13.   NSLog(Point at (%d, %d)", X, Y);  
  14. } // Show  
  15. // Point 

下面進行逐句分析。

@implementation是一個編譯器指令,表明它將為某個類提供代碼。類名Point)出現在@implementation之後,該行的結尾處沒有分號。

接下來是各個方法的定義,它們不必按照在@interface指令中的順序出現。你甚至可以在@implementation中定義那些在@interface中無相應聲明的方法。可以把它們看成是私人方法,僅在類的實現中使用。

方法定義中的第一行看上去與@interface部分的聲明非常類似,二者間的主要差別就是結尾處沒有分號,另外還需要注意到我們將方法的參數重新命名了,@interface部分的方法聲明中使用了名稱X和Y,是為了確切告訴讀者參數的用處。在具體實現中,我們必須區分參數名稱和執行個體變數名稱,所以需要將參數重新命名。

SetX方法和SetY方法的結構幾乎一樣,對於Show方法需要注意,方法名的結尾處沒有冒號,說明它不使用任何參數。

最後的“@end”代碼告訴編譯器,我們已經完成了Point類的實現。

執行個體化對象

執行個體化對象就是根據我們前面寫好的聲明建立一個新對象。為了建立新的對象,我們先來熟悉一個新的操作符——“[]”操作符。

在C語言中,程式員使用方括弧引用數組元素。而在Objective-C中,方括弧還有其他意義:它們用於向某個對象發送訊息,通知其執行某種操作。在在方括弧內,第一項是對象,其餘部分是你需要發送的訊息。例句如下:

 
  1. [Point new] 

Objective-C具有一個極好的特性,你可以把類當成對象來向類發送訊息。在本例中,我們就是向Point類發送new訊息,通知Point類建立一個新對象。以下是完整的執行個體化對象代碼。

 
  1. int main (int argc, const char* argv[]){  id thisPoint;  
  2.    thisPoint = [Point new];   
  3.     [thisPoint SetX: 0];   
  4.      [thisPoint SetY: 0];     
  5.      [thisPoint Show];  
  6.  }    
  7. // main 

下面進行逐句分析。

這個main()函數和普通C程式中的main()函數沒有什麼區別,參數argc儲存啟動參數的數量,因為程式名常用作啟動參數傳遞,所以argc通常為1或更大。參數argv數組用於儲存啟動參數,argv[0]通常就是程式名,如果有其他啟動參數,依次存放在argv[1]、argv[2]等等。

id代表identifier,是一種泛型,用於表示任何種類的對象。實際上,id就是指向某個對象的指標。

通過給Point類發送new訊息,建立了一個Point類的執行個體,thisPoint中儲存的就是指向這個市裡的指標。

接下來就是通過給thisPoint對象發送SetX和SetY訊息來設定其元素X和Y。需要注意到,和方法聲明中類似,[]操作符發送給對象的訊息需要攜帶參數時,在訊息之後需要使用冒號,而攜帶的參數就跟隨在冒號的後面。

最後就是通過給thisPoint對象發送Show訊息顯示其相關資訊。同樣需要注意,當發送的訊息沒有參數時,後面千萬不可使用冒號。

繼承

編寫物件導向的程式時,你所建立的類和對象之間存在一定的關係。它們協同工作才能實現程式相應的功能。處理類和對象間的關係時,OOP有個很重要的特性叫做繼承,使用繼承可以定義一個具有原有類所有功能的新類。

在前文的@interface部分聲明新類的時候,其實已經用到了繼承的文法。

 
  1. @interface Point : NSObject  

如上例中所示,冒號後的標識符就是需要繼承的類。在Objective-C中,可以從非類中繼承對象,但如果使用Cocoa,會希望從NSObject繼承對象,因為NSObject提供了大量有用的特性。@interface部分最簡單的繼承代碼可以如下所示:

 
  1. @interface MyPoint : Point@end  // MyPoint 

這時,MyPoint類就繼承了Point類的所有資料成員和方法。在下面的文字中,我們統一用超類來描述所繼承的類,用子類來描述實施繼承的類。這裡Point就是MyPoint的超類,而MyPoint就是Point的子類。

我們在寫新的子類時,有時為了在類中引入某個獨特的特性,需要添加新方法。還有些時候,可能需要替換或增強由這個新類的某個超類所定義的現有方法。

Objective-C提供某種方法來重新方法,並且仍然調用超類的實現方式。為了調用繼承方法的實現,需要使用super作為方法調用的目標。

繼續沿用前面給出的例子,假設我們發現之前採用的座標有偏差,實際上的X座標應為原有的X-10。我們便可在子類MyPoint中對Point類的Show()方法進行如下重寫。

 
  1. @implementation MyPoint   
  2. - (void) Show{  XX = X - 10;  [super Show];  
  3. }    
  4. // Show @end  // MyPoint 

從上面的代碼中,我們通過向super發送Show訊息使用了超類的相應代碼。

這裡的super既不是參數也不是執行個體變數,向super發送訊息時,實際上是在請求Objective-C向該類的超類發送訊息。如果超類中沒有定義該訊息,Objective-C將按照慣常的方式在繼承鏈中繼續尋找對應的訊息。

小結:詳解Objective-C學習筆記之物件導向編程的內容介紹完了,希望本文對你有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.