前回の続きです。
前回はリレーション型オブジェクト指向がどのようなコードで記述されるかのイメージを提示しましたが、
肝心のオブジェクト指向らしい部分が欠けていました。今回は隠蔽と継承と多態を取り上げます。
リレーション型データ構造における継承
まずは継承からいってみましょう。前回Javaなどのclassを拡張するイメージでtableキーワードを用いていましたが、
これらtableに対してextendsキーワードによる継承を定義します。
public table T1 {
private int val1;
}
public table T2 extends T1 {
private int val2;
}
この場合、T2型は親であるT1型に暗黙にキャスト可能です。これはJavaと同じですね。
そして、T1に対してSELECTすることで、T1およびT2から検索することが可能となります。T2に対してのSELECTではT2だけからSELECTされます。
T1に対してSELECTした場合、戻り型はT1の配列となります。
T1[] t1array = T1.SELECT();
リレーション型データ構造における多態
次は多態(ポリモーフィズム)です。
フィールドだけではなく、インスタンスメソッドもまた継承され、T1にメソッドを定義すればT2でも利用可能です。
public class T1 {
private int value;
public int getValue() {
return this.value;
}
}
public class T2 extends T1 {
private int exValue;
@Override
public int getValue() {
return this.exValue;
}
}
となっている場合、
T1 t1 = new T2();
int value = t1.getValue();
と記述することでオーバーライドされたT2のgetValue()が呼び出されることになります。
通常のRDBMSではSELECTなどの処理の際にレコードのデータをもとに選別することになりますが、
レコードにメソッドを持つわけですから、SELECTのWHERE句相当の部分でメソッドの戻り値による条件設定が可能となるでしょう。
その際、この多態性を利用することが出来ることになります。これが非常に面白そうな部分だと思っています。
リレーション型データ構造における隠蔽
通常のオブジェクト指向ではメソッドの属するクラスによってアクセスレベルを定義しています。
通常のRDBMSではこのアクセスレベルは定義できませんが、レコードに対してメソッドを定義できる言語を想定した場合、
同等の意味合いでアクセスレベルを定義してデータの隠蔽(カプセル化)を行うことができます。
privateであるフィールドはそのレコードに定義されたメソッド内部だけからアクセスされるような仕組みに
することができるようになることでしょう。
議論を残している部分
今回はとりわけオブジェクト指向とされる部分について簡単に解説してみました。
あまり議論されていない部分としては、SELECTなどの機能性ですね。
SQLにそのまま対応する機能性を持たせればよいのか、どうなのか、よくわかっていません。
ひとつだけ本稿では、クエリー中でレコードに定義されたメソッドを利用できるようになるのではないかという点にのみ触れました。
このような機能性をもつ言語を想定できますが、有用なのか、ナンセンスなのか、
そもそも私の思い描いたリレーション構造+オブジェクト指向というものが成り立つのかどうか。
このあたりは参照実装でも用意することができると議論しやすいのかもしれませんね。
投稿日時 : 2007年11月20日 22:06