Home Notices Documents Classes Download Others Rice
Documents  >  開発  >  動的組み込みクラスの実装  >  ゲッタ
ゲッタの実装

このページの目的

このページは概要のページで述べたように、Rtemplate.csを五つに分けた四つ目の部分を詳説します。



今回説明する部分では、_getter()メソッドを定義しています。これはRtypeの定義で宣言されている抽象メソッドで、Rtypeの派生クラスで必ず実装しなければいけません。

したがって、組み込みクラスの実装では_getter()メソッドを必ず定義しなければいけません。

_getter()メソッドはクラスのインターフェースであるゲッタの振舞を定義するためのメソッドです。ゲッタはインスタンスから値を取得するためのインターフェースであり、C#のプロパティのgetに相当します。


最初のセクションでゲッタについて説明します。

_getter()メソッドで重要なのはメソッドの引数です。引数毎にセクションを設けて解説します。

最後に実装の例を示すためのセクションを設けます。

ゲッタとは

ゲッタはインスタンスから値を取得するためのインターフェースです。

ゲッタの振舞をfileクラスを例として示します。


file someFile = new file("c:\somewhere....");

string path = someFile.FullName;


FullNameがゲッタです。例に示すようにsomeFileのFullNameを呼び出すことでsomeFileのパスが返ります。このようにインスタンスの状態を値として取得するためのインタフェースがゲッタです。


ゲッタが呼び出された時のRiceの振舞を説明します。

ゲッタが現れた場合、Riceはゲッタの名前からゲッタを呼び出す名前(ゲッタシグネチャ)を作成します。ゲッタシグネチャはゲッタの名前と同一になります。上の例で言えば、ゲッタの名前がFullNameなので、ゲッタシグネチャFullNameを作成します。このゲッタシグネチャを渡してsomeFileの_getter()メソッドに呼び出すことでsomeFileの状態が値として返されるわけです。

第一引数 : string signature

作成されたゲッタシグネチャは_getter()の第一引数であるsignatureとしてメソッドに渡されます。

ゲッタシグネチャの生成規則については上で説明したとおりです。ゲッタの名前がそのままゲッタシグネチャになります。


この様にして作成されたゲッタシグネチャが_getter()の第一引数であるsignatureとしてメソッドに渡されます。

第二引数 : VirtualMachine vm

第二引数としてVirtualMachineクラスのインスタンスが渡されます。これはスクリプトが実行されている仮想機械を表します。

この引数のほぼ唯一の使用目的は例外クラスのインスタンスの取得です。もし例外を投げる必要があるときはVirtualMachineから取得してください。

例えば


throw vm.GetRtypeException("例外のメッセージ");


_getter()メソッド内から投げる例外ですので、RtypeExceptionクラス(クラス関連の例外を想定している)を用いるのが適切です。そこでGetRtypeException()でそのインスタンスを取得して投げています。

この引数は、例外についての詳細なメッセージを持たせたい場合に役に立ちます。また、例外の発生場所に近いところから例外を投げれば補足的な情報もより正確になります。補足的な情報とは例外が発生したソースファイル名や行数などの位置情報です。VirtualMachineクラスから例外を取得すれば、それらの情報は自動的に例外にセットされます。

C#としての普通の例外を投げても、それはすぐ捕捉されてUnknownExceptionクラスに変換されます。その際に補足的な情報が自動的にセットされるので、それほど神経質になる必要はありません。

実装の一案

signatureにゲッタシグネチャが格納されていることを利用して必要な処理を行えます。

ここではtemplateクラスのためにintクラスを返すゲッタとstringクラスを返すゲッタの実装例を示してみます。

1:public override Rtype _getter(string signature, VirtualMachine vm) {
2:switch (signature) {
3:case "IntGetter": {
4:// インスタンスの状態に応じたRintを返す。
5:return new Rint();
6:}
7:case "StringGetter": {
8:// インスタンスの状態に応じたRstringを返す。
9:return new Rstring();
10:}
11:default:
12:return null;
13:}
14:}

この例ではswitch文を使いsignatureに格納されたゲッタシグネチャを判定して条件分岐させています。各caseの値はゲッタの名前から作成できます。

templateクラスは内部状態を持たないので、この例のゲッタはデフォルトのRint(0)とRstring("")を返していますが、実際の組み込みクラスの実装ではcaseで分岐した後に必要な処理を行いインスタンスの状態を反映したRtype派生クラスを返すべきです。ゲッタの処理が終了したらRtype派生クラスを返していることに注意してください。Rtype派生クラスはゲッタが存在し処理が無事に終了したことを示します。

default:でnullを返しています。nullは適切なゲッタが存在しなかったことによる処理失敗を表します。nullが返された場合は例外が投げられます。

TypeNameとFittedゲッタ

非インターフェース部分の実装のページで、TypeNameゲッタが_typenameフィールドを参照し、FittedゲッタがFitted()メソッドを参照すると述べました。

この二つのゲッタは、そのような振舞をするようにRiceが自動的に実装します。従って、_getter()メソッドでこれらのゲッタを実装する必要はありません。

もし実装したとしても、実装したTypeNameゲッタやFittedゲッタのコードは呼び出されません。

ゲッタが無い場合の実装

クラスにゲッタが必要無い場合もあります。

そのような場合は以下のように_getter()メソッドを実装してください。

1:public override Rtype _getter(string signature, VirtualMachine vm) {
2:return null;
3:}

次のページでは

これでゲッタの実装についての説明は終了です。

次のページではクラスのインターフェースであるメソッドの実装について説明します。

Next
Previous
Copyright © CookerGX All rights reserved.