2011年7月19日 星期二

Object-C 牛刀小試 (建立 Class)

@interface
  • Fraction.h
    #import <Foundation/NSObject.h>
    
    @interface Fraction: NSObject {
        int numerator;
        int denominator;
    }
    
    -(void) print;
    -(void) setNumerator: (int) n;
    -(void) setDenominator: (int) d;
    -(int) numerator;
    -(int) denominator;
    @end
    • NSObject:NeXTStep Object 的縮寫。因為它已經改名為 OpenStep,所以這在今天已經不是那麼有意義了。
    • 繼承(inheritance)以 Class: Parent 表示,就像上面的 Fraction: NSObject。
    • 夾在 @interface Class: Parent { .... } 中的稱為 instance variables。
    • 沒有設定存取權限(protected, public, private)時,預設的存取權限為 protected。設定權限的方式將在稍後說明。
    • Instance methods 跟在成員變數(即 instance variables)後。格式為:scope (returnType) methodName: (parameter1Type) parameter1Name;
      • scope 有class 或 instance 兩種。instance methods 以 - 開頭,class level methods 以 + 開頭。
    • Interface 以一個 @end 作為結束。
@implementation
  • Fraction.m
    #import "Fraction.h"
    #import <stdio.h>
    
    @implementation Fraction
    -(void) print {
        printf( "%i/%i = %f", numerator, denominator,((float)numerator/(float)denominator));
    }
    
    -(void) setNumerator: (int) n {
        numerator = n;
    }
    
    -(void) setDenominator: (int) d {
        denominator = d;
    }
    
    -(int) denominator {
        return denominator;
    }
    
    -(int) numerator {
        return numerator;
    }
    @end
    • Implementation 以 @implementation ClassName 開始,以 @end 結束。
    • Implement 定義好的 methods 的方式,跟在 interface 中宣告時很近似。
方法呼叫
  • main.m
    #import <stdio.h>
    #import "Fraction.h"
    
    int main( int argc, const char *argv[] ) {
        // create a new instance
        Fraction *frac = [[Fraction alloc] init];
    
        // set the values
        [frac setNumerator: 5];
        [frac setDenominator: 10];
    
        // print it
        printf( "The fraction is: " );
        [frac print];
        printf( "\n" );
    
        // free memory
        [frac release];
    
        return 0;
    }
  • output
    The fraction is: 5/10 = 0.500000
    • Fraction *frac = [[Fraction alloc] init];
      • 在 Objective-C 中呼叫 methods 的方法是 [object method],就像 C++ 的 object->method()。
      • Objective-C 沒有 value 型別。所以沒有像 C++ 的 Fraction frac; frac.print(); 這類的東西。在 Objective-C 中完全使用指標來處理物件。
      • 這行程式碼實際上做了兩件事: [Fraction alloc] 呼叫了 Fraction class 的 alloc method。這就像 malloc 記憶體,這個動作也做了一樣的事情。
      • [object init] 是一個建構子(constructor)呼叫,負責初始化物件中的所有變數。它呼叫了 [Fraction alloc] 傳回的 instance 上的 init method。這個動作非常普遍,所以通常以一行程式完成:Object *var = [[Object alloc] init];
    • [frac setNumerator: 1] 非常簡單。它呼叫了 frac 上的 setNumerator method 並傳入 1 為參數。
    • 如同每個 C 的變體,Objective-C 也有一個用以釋放記憶體的方式: release。它繼承自 NSObject,這個 method 在之後會有詳盡的解說。

沒有留言:

張貼留言