多重分類と動的分類(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"); // 表示される
}

ここまで考えてみて、思ったこと。

「普通の javaデザインパターンや、内部クラスをうまく使って、実現させたほうが簡単じゃないのか?」