iphone開發的基礎二類的實現

來源:互聯網
上載者:User

接著上文http://www.bkjia.com/kf/201202/119761.html來說,上面我們是定義了一個介面的定義,下面我們來實現它,object c中的類檔案使用副檔名m. 

[plain]
Fraction.m 
#import "Fraction.h" 
@implementation Fraction 
-(void) setNumerator: (int) n{ 
numerator=n; 
-(void) setDenominator: (int) d{ 
denominator=d; 

-(void) setNumerator: (int) n andDenominator: (int) d{ 
numerator=n; 
denominator=d; 

-(int) numerator{ 
return numerator; 

-(int) denominator{ 
return denominator; 

-(void) print{ 
printf("%d/%d\n",numerator,denominator); 

-(void) m{ 
printf("-m:The class variable t is %d\n",++t); 

+(void) t{ 
printf("+t:The class variable t is %d\n",++t); 

@end 

因為我們將Fraction.m 與Fraction.h 放在一個檔案夾下面,所以#import 使用了” ”,這個類的
任務就是實現介面中的方法,因此與介面的結構不同的地方就是,你不能在這裡定義變數,
@interface 換成了@implementation,其餘就沒有什麼特別的了。你不必在這裡實現@interface
中的全部方法,這不會導致錯誤。這裡有個-(void) m 方法比較特別,我們並沒有在@interface
中聲明,那麼這個方法可以調用嗎?因為Object-C 是動態語言,即便是@interface 中沒有定
義的方法,依然可以被調用。
另外,你需要注意的是setter 方法與介面中不同的是參數名縮寫成了n、d,這是因為在方
法中,本地變數(參數、方法中定義的變數)在名稱衝突的情況下,會隱藏成員變數,因此
導致numerator=numerator 變成了無意義的操作。當然你可以使用後面提到的self 關鍵
字,寫成 self->numerator=numerator,也就是JAVA 中的常用的this.x=x 的寫法。
     下面我們編寫調用代碼,因為Object-C 基於C 語言,所以程式的入口依然是main 函數。這
裡注意#import 的是h,不是m。代碼如下:    

main.m

[html]
#import "Fraction.h" 
int main(int argc,const char *argv[]){ 
Fraction *frac=[[Fraction alloc] init]; 
[frac setNumerator: 3 andDenominator: 5]; 
[frac print]; 
printf("The denominator of Fraction is %d\n",frac->denominator); 
[Fraction t];//調用類方法 
[frac m]; 
[frac release]; 
return 0; 

(1.) 第一行我們建立了Fraction 的執行個體(對象),Object-C 中執行個體只能使用指標作為變數,而
不能使用值,所以你看到了*frac,而不是frac,這與JAVA 是一致的,JAVA 中的指向實
例的變數(JAVA 中叫做引用)也是指標,只不過JAVA 中沒有指標的概念,所以你沒有
看到*。至於等號右側的建立執行個體的代碼,你可以在下面看到,這裡先不用理會。
(2.) 第二行代碼調用同時設定兩個變數的方法,我們看到Object-C 的調用方法的文法格式為
[類或者執行個體的指標 方法名: 參數1 標籤1: 參數2… …]。這種調用格式被稱為中綴
文法,初次看起來有點兒怪,但實際這樣更加有效。舉個例子,你接手了一個離職的人
程式,其中的JAVA 程式調用了一個有五個甚至更多的參數的方法,但是你手裡沒有這
個方法的API,那麼你很難猜得出來這五個參數到底都幹什麼用的,但是Object-C 調用
的時候,每個參數前面都必須有方法的標籤名,這樣你便能很容易的從標籤名看出這個
參數是什麼意思。
(3.) 第四行在C 的printf()函數中使用了對象->成員變數的文法訪問執行個體的變數,但一般我
們不推薦這麼做,而是使用getter 方法。這裡你不能訪問numerator 變數,因為它是
@protected 的,只能本類、子類直接存取。
(4.) 第五行我們調用了類方法t,你也可以換成這樣的寫法:
[[Fraction class] t];
或者
Class clazz=[Fraction class];
[clazz t];
class 方法是一個類方法,來自於NSObject,相當於JAVA 中的getClass()方法,也就是獲
取這個類的Class 對象,clazz 前面沒有*。另外這種嵌套調用的方式,你也要習慣,這就
和JAVA 中的A.b().c()沒有什麼區別。

(5.) 第六行我們調用了m 方法,這個方法你會發現並沒有在@interface 中聲明,這裡依然調
用了,只是在編譯的時候收到一個警告。這就是前面所有的Object-C 是動態語言的原因。
但是一般情況下,你都會給別人提供h 檔案,所以你在m 檔案中寫的h 檔案中沒有的
方法,別人也是不會知道的,這個方法相當於變相的私人化了。

(6.) 第七行我們釋放了frac 執行個體在第一行alloc 所申請的記憶體空間,Object-C 的記憶體管理後面
會看到。另外,你會發現Fraction.h 中沒有定義alloc、init、release 方法,但是我們上面
調用了,很顯然,這些方法來自於父類NSObject。


摘自 TQUDING的專欄

相關文章

聯繫我們

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