多重分類と動的分類(2)
多重分類や動的分類をサポートする言語の仕様を考えてみた。
基本的な考えかたは、class構文から、オブジェクトテンプレートの機能を取り除き、純粋にクラス分類機能に特化させる。
// 点数をA〜Eの評価に分類するクラスの定義 class ScoreCategory : this has_method getPoint; // クラス分類述語 "getPointメソッドを持っている"という意味 this has_method setPoint; // クラス分類述語 "setPointメソッドを持っている"という意味 { // 抽象メソッド定義 void doSomething(); class Nothing extends ScoreCategory : this.getPoint() > 100 || this.getPoint() < 0; // クラス分類述語 { void doSomething() { // 実装 } } class A extends ScoreCategory : this.getPoint() >= 80; // クラス分類述語 { void doSomething() { // 実装 } } class B extends ScoreCategory : this.getPoint() >= 60; // クラス分類述語 { void doSomething() { // 実装 } } class C extends ScoreCategory : this.getPoint() >= 40; // クラス分類述語 { void doSomething() { // 実装 } } class D extends ScoreCategory : this.getPoint() >= 20; // クラス分類述語 { void doSomething() { // 実装 } } class E extends ScoreCategory : else; // 今まで定義されたクラスに当てはまらないものを意味する述語 { void doSomething() { // 実装 } } }
javaっぽい構文にしてみた。分類述語を指定する構文はかなり適当。なにかあいまいな部分があっても、適宜読みかえて下さい。
使い方は、
((ScoreCategory)obj).doSomething();
のように、クラス分類の述語にあてはまるオブジェクトをキャスト(のような作用を)させて使うことを想定。こうすることで、obj参照毎にScoreCategory内に書かれているクラス(Nothing及び、A〜E)に動的分類する。
また、ScoreCategoryと同等のクラス定義を複数つくることで、多重分類を実現。
// ScoreCategoryの中に書かれたクラスのどれかに分類後、定義されたメソッドを呼び出す。 ((ScoreCategory)obj).doSomething(); // OtherCategoryの中に書かれたクラスのどれかに分類後、定義されたメソッドを呼び出す。 ((OtherCategory)obj).doSomething();
なおかつ、class内にclassを定義していくことで、階層的分類も実現。
class AClass ... some predicate ... { class BClass extends AClass ... some predicate ... { class CClass extends BClass ... some predicate ... { } class DClass extends BClass ... some predicate ... { } } } AClass obj = ObjectCreate(); // AClass.BClass.CClass に分類可能なobjを生成 if( obj instanceof AClass.BClass.CClass ) { printf("I am CClass"); // 表示される } if( obj instanceof AClass.BClass.DClass ) { printf("I am DClass"); // 表示されない } if( obj instanceof AClass.BClass ) { printf("I am BClass"); // 表示される }
ここまで考えてみて、思ったこと。