Objective-C 快速導覽 - 類別

類別 (class) 是物件 (object) 的模板,物件的所有功能都由類別設置, Objective-C 的類別分成兩個部份,一個是宣告方法 (method) 與屬性 (property) 的介面 (interface) ,另一個則是方法的實作 (implement) 。



典型的類別設計如下
// 介面區段
@interface ClassName: ParentClassName
    // 屬性與方法的內容
@end

// 實作區段
@implementation ClassName
   // 方法的內容
@end

// 程式區段
int main() {
    // 如何使用與執行 ClassName
}


也就是說,具有類別的程式需要三個區段,其一為介面區段,由指令 @interface 開始,到指令 @end 結束,其二為實作區段,由另一個指令 @implementation 開始,同樣到下方的 @end 結束,最後則是程式區段,就是 main() 函數 (function) 的地方,在 main() 中定義如何使用與執行自行定義的類別。


舉一例如下
#import <Foundation/Foundation.h>

// 介面區段
@interface Demo: NSObject
{
 int a;
 int b;
}

- (int) a;
- (int) b;  
- (id) setA: (int) pa;
- (id) setB: (int) pb;
- (int) do_something;

@end

// 實作區段
@implementation Demo

- (int) a
{
    return a;
}

- (int) b
{
    return b;
}

- (id) setA: (int) pa 
{
    a = pa;
    return self;
}

- (id) setB: (int) pb
{
    b = pb;
    return self;
}

- (int) do_something
{
    return a + b;
}

@end

// 程式區段
int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Demo *demo = [[Demo alloc] init];
 
    [demo setA: 11];
    [demo setB: 22];
    NSLog(@"a = %d, b = %d", [demo a], [demo b]);
    NSLog(@"a + b = %i", [demo do_something]);
 
    [pool drain];
    return 0;
}

/* 《程式語言教學誌》的範例程式
   http://pydoing.blogspot.com/
   檔名:classdemo.m
   功能:Objective-c 程式範例
   作者:張凱慶
   時間:西元 2013 年 4 月 */


此例的類別名稱為 Demo ,冒號後面為所繼承的類別, Objective-C 中的類別都是繼承自 Foundation.h 中的 NSObject , NSObject 提供物件基本的屬性及方法
@interface Demo: NSObject


接著用大括弧圍起來的是宣告屬性,宣告時要標明型態及識別字名稱
{
 int a;
 int b;
}


下方則是宣告方法,開頭的減號表示為實體方法,也就是物件可以用的方法,第一個小括弧為方法的回傳值型態,沒有回傳值的發訪要宣告為 void
- (int) a;
- (int) b;  
- (id) setA: (int) pa;
- (id) setB: (int) pb;
- (int) do_something;


注意,這裡的 ab 跟屬性 ab 同名,因為這是 getter 方法,用來取得屬性值,而 setAsetB 則是 setter 方法,用來設定屬性值,後面接冒號,其後為參數的型態的識別字名稱。


方法實作方面,有回傳值的方法最後都要有個 return 陳述,用來回傳數值
- (id) setA: (int) pa 
{
    a = pa;
    return self;
}


NSObject 的 alloc 用來分配記憶體空間, init 用來初始化物件,注意,凡是儲存物件的變數都得用指標 (pointer)
Demo *demo = [[Demo alloc] init];


我們可以看到 Objective-C 的訊息傳遞風格,所有的訊息在執行期才會被解讀,像是下面是向 demo 傳遞 do_something
NSLog(@"a + b = %i", [demo do_something]);


由於 do_something 是回傳 ab 的相加值,因此這裡會得到相加的結果。


編譯執行,結果如下



中英文術語對照
類別class
物件object
方法method
屬性property
介面interface
實作implement
指標pointer


您可以繼續參考
類別


相關目錄
Objective-C 快速導覽
Objective-C 教材
首頁



參考資料
Programming with Objective-C: About Objective-C
Programming with Objective-C: Working with Objects

沒有留言: