Kuinでは、クラスを図1-1のように定義します。
括弧内にクラス名を書くと、そのクラスを継承したクラスになります。 省略すると「kuin@Class」を継承します。 従って、すべてのクラスは継承元を辿ると最終的に「kuin@Class」を継承していることになります。
メンバ定義には、alias文、const文、var文、classブロック、enumブロック、funcブロックが書けます。
このうち、var文はクラスのプロパティ(メンバ変数)となり、funcブロックはメソッド(メンバ関数)となります。 それ以外はクラス内でのみ参照できる定義となります。
クラスの仕様は図1-2の通りです。
メソッドは、定義の先頭に「*」を付けることで、継承元クラスの同名メソッドを継承して上書きできます。
継承の仕様は図2-1の通りです。
継承先メソッド内から継承元メソッドを呼び出すには「super」を使います。 superは継承先メソッド内でのみ参照できる関数で、第1引数にはmeを渡して呼び出します(図2-2)。
このプログラムを実行すると、Parentクラスのfメソッドが呼び出されて「3*3=9」が計算されたのちに、Childクラスのfメソッド内で「9+3=12」が計算され、「12」が表示されます。
kuin@Classに定義されているメソッドのうち、「ctor」「cmp」は継承可能です。
ctorメソッドを継承すると、コンストラクタ(インスタンス生成時の初期化処理)が実装できます。 ctorメソッドの定義は図3-1の通りです。
ctorメソッドを継承しない場合、何も処理をしない空のメソッドになります。 ctorメソッドの実装例は図3-2の通りです。
このプログラムを実行すると、「#Test」の段階でTestクラスのctorメソッドが呼ばれ、最終的に画面には「5」が表示されます。
cmpメソッドを継承すると、クラスの比較処理が実装できます。 cmpメソッドの定義は図3-3の通りです。
cmpメソッドを継承しない場合、比較時に例外(0xE9170004)が発生し、比較できないクラスとなります。 cmpメソッドの使用例は図3-4の通りです。
この例ではTestクラスの比較方法を、aとbの和で定めています。
クラスのインスタンスは、そのクラスとその継承元クラスの型にのみ変換できます(図4-1)。
ただし継承先クラスに変換する場合には、「$」演算子によって明示的にキャストしないとコンパイルエラーになります。 このときインスタンスが、そのインスタンスのクラスおよび継承元クラスの型に変換される場合には変換できますが、継承先クラスに変換される場合には例外(0xE9170001)が発生します(図4-2)。
キャストに成功するかどうかは「=$」もしくは「<>$」演算子で判断できます。