ゲッタ
このページの目的
このページで説明する部位を以下に示します。テンプレートを五つに分割したうちの四つ目の部位になります。
_getter() メソッドは Rice クラスのインターフェースであるゲッタの振舞を定義します。ゲッタはインスタンスの状態を取得するためのインターフェースです。
このメソッドは Rtype クラスの定義で抽象メソッドとして宣言されています。したがって、Rtype 派生クラスで実装しなければいけません。
fake クラスにゲッタ Value を定義することによって、ゲッタの定義方法を説明します。
目次:
ゲッタとは
ゲッタはインスタンスの状態を取得するためのインターフェースです。その振舞は以下のようになるでしょう。
fake fakeInstance = new fake("初期データ");
string data = fakeInstance.Value; // data は "初期データ"。
"Value" がゲッターです。 インスタンスの状態を値として取得できます。
第一引数 : string signature
ゲッタが現れた場合、Rice はゲッタの名前からゲッタを呼び出す名前、ゲッタシグネチャを作成します。ゲッタシグネチャはゲッタの名前と同一になります。
作成されたゲッタシグネチャは _getter() メソッドの第一引数として渡されます。
第二引数 : VirtualMachine vm
第二引数として VirtualMachine クラスのインスタンスが渡されます。これはスクリプトを実行している仮想機械です。
例外を投げる必要があるときは、この引数から取得してください。例外が発生したソースファイル名や行数などの情報がセットされた例外が取得できます。
throw vm.GetRtypeException("例外のメッセージ", "例外名"); // 補足的な情報がセットされた例外。 |
テンプレートの修正
_getter() メソッドを fake クラスのために修正します。
1: | public override Rtype _getter(string signature, VirtualMachine vm) { |
2: | switch (signature) { |
3: | case "Value": { // "Value" |
4: | return new Rstring(InternalData); |
5: | } |
6: | default: |
7: | return null; |
8: | } |
9: | } |
switch 文を使い適切なルーチンへ分岐させています。
三~五行目で Value ゲッタを定義しています。内部データを使って初期化された、string クラスの新しいインスタンスを返します。
ゲッタルーチンから Rtype 派生クラスが返された場合は、第一引数に対応するゲッタが存在して処理が成功したことを示します。
default: で null を返しています。null は対応するゲッタが存在しなかったことによる処理失敗を表します。null が返された場合は Rice が例外を投げます。
TypeName と Fitted ゲッタ
全ての Rice クラスが持つ二つの特別なゲッタがあります。
一つ目は TypeName ゲッタです。前述したように_typename フィールドを参照してクラス名を返します。
二つ目は Fitted ゲッタです。Fitted() メソッドを参照してインスタンスの初期化状態を返します。
これらの二つのゲッタは Rice が自動的に生成します。_getter() メソッドでこれらのゲッタを実装する必要はありません。
もし実装したとしても、実装した TypeName ゲッタや Fitted ゲッタのコードは呼び出されません。
ゲッタが無い場合の実装
クラスにゲッタが必要無い場合は、以下のように _getter() メソッドを実装してください。
1: | public override Rtype _getter(string signature, VirtualMachine vm) { |
2: | return null; |
3: | } |