Currency Converterのモデルは、2つの変数、すなわちUSドル単位の金額と為替レートをカプセル化する、シンプルなクラスです。このモデルのジョブは、2つの数値を乗じて結果を返すことです。つまりこのモデルには次の要素が必要であるということです。
1つのクラス:Converter
型がfloatの2つの変数:sourceCurrencyAmountとrate
1つのメソッド:(float)convertCurrency
メンバ変数を宣言する
宣言されたプロパティとアクセサメソッド
モデルメソッドを宣言する:convertCurrency
2つの変数はconverterクラスの中括弧の内側で定義します。次のようにして変数を定義します。
Converter.hがまだ編集用に開かれていない場合は、「グループとファイル」メニューのClassesグループで、Converter.hをダブルクリックします。編集ウインドウにこのファイルが開きます。
リスト 3-1のハイライトされている行を、Converter.hに挿入します。
リスト 3-1 Converter.hでのメンバ変数の宣言
#import <Cocoa/Cocoa.h> |
@interface Converter :NSObject { |
float sourceCurrencyAmount, rate; |
} |
オブジェクトは、「クラスとオブジェクト」で述べたようにデータをカプセル化します。オブジェクトの変数の有効範囲は、当該オブジェクト、すなわちそのクラスのインスタンスに限定されます。たとえば、顧客クラスの1つのインスタンスは自身のデータのみ参照でき、任意の顧客オブジェクトのデータを参照できるわけではありません。ただし、ある顧客が自身と別の顧客を比較する必要がある場合があります。これができるようにするには、オブジェクトがカプセル化しているデータを読み書きするアクセサメソッドをクラスで用意します。これにより、どのデータを共有するかの決定をクラスで行うことができます。たとえば、あるクラスでそれがカプセル化している特定の変数を、他のクラスとは共有せずに内部専用に使いたい場合は、その変数に対してアクセサメソッドを指定しないこともできます。これは、クラスで外部エンティティの変数への読み取り専用アクセス許可が必要な場合にも同じです。その場合、クラスには値を取得するメソッドを指定しますが、値を設定するメソッドは指定しません。
Objective-C 2.0には、宣言されたプロパティと呼ばれる機能が提供されています。プロパティの宣言は、事実上、クラスのインスタンスの属性に対してsetterとgetterを宣言するための簡単な方法です。宣言自体のほかに、コンパイラにアクセサの合成を指示するディレクティブと、実行時に自分自身でメソッドを指定することをコンパイラに伝えるディレクティブがあります。プロパティには、宣言と実装という2つの部分があります。
プロパティは次のように宣言します。
@property(attributes) Type variableNameList;
attributesは、たとえばreadwriteやcopyなど、コンマで区切られたキーワードのリストです。
@property(copy) NSString *name;
Currency Converterに対しては、Converter.hのconverterクラスの閉じ括弧の後に、次の行を追加します。
@property(readwrite) float sourceCurrencyAmount, rate; |
コンパイル時に、コンパイラはこれを次のメソッドが宣言されたかのように処理します。
- (float)sourceCurrencyAmount; |
- (void)setSourceCurrencyAmount:(float)newSourceCurrencyAmount; |
- (float)rate; |
- (void)setRate:(float)newRate; |
注: Objective-C 2.0の機能は、Mac OS X 10.5以前のオペレーティングシステムを実行するシステムとは互換性がありません。Mac OS X 10.4またはそれ以前のバージョンで作業している場合は、これらのメソッドを手動で宣言する必要があります。
現時点ではこれらのメソッドの実装はありません。次のセクションでは、メソッドを実装します。
モデルに必要な1つのメソッドは、converterクラスによってカプセル化された2つの値を乗じるシンプルな関数です。
下の行を、Converter.hの次のコード行として追加します。
- (float)convertCurrency; |
このメソッドは引数を取りませんが、メソッドには渡されず、メソッドでインスタンス化もされない2つの値を乗じます。これは、このメソッドがconverterクラスの一部であり、converterクラスのメンバ変数にアクセスできるため可能となっています。このメソッドはこれらの変数を、ローカル変数としてすでに定義済みであるかのように扱います。変数が有効範囲内にあるときでもアクセサメソッドを使うことはよくありますが、このアプリケーションの場合は、コマンドself.variableName(selfはオブジェクトの現在のインスタンスへのポインタであるキーワード)を使って変数にアクセスします。次のセクションでは、コンバータの動作を定義し、この仕組みを理解します。
Last updated: 2008-01-24