2020年7月18日投稿 / 投稿者 : りょうたんぽ / タグ : 投稿プログラム ツール ライブラリ オブジェクト指向
オブジェクト指向もどきのためのライブラリ!! ……のテスト、というかデモ。プロジェクト名 OOPTEST。まだまだ途中だけど、一応使える形にはなってます。これからも更新します!
実はこのライブラリは「そのまま利用するライブラリ」として開発しているわけではありません。そのうち SB++ なる言語を作って、プチコン4で動かせるように変換し、その変換されたプログラムが利用するランタイムライブラリにしようと考えてます。そのまま使うには若干不便だけど、特に問題はないです!実際に、この後出て来るサンプルではライブラリをそのまま利用してます。コンバータが完成して SB++ プログラムが変換されたとき、そのような感じのプログラムになります。多分。
ライブラリファイル名は SBPLUSPLUS.LIB となってます。
ライブラリを使うために、まず適当なスロットにライブラリを読み込みます。さらに、Objectクラスの宣言が必要です。
- exec ”sbplusplus.lib”,1
- const #SBPP_null=0
- @Object_Global
- enum\
- #Object_base=#SBPP_null,\
- #Object_magic,\
- #Object_this,\
- #Object_all
- const #Object=”%%$$”
特に肝心なのは #Object_all と #Object です。
あるクラス名を Class としたとき、#Class_all は別のクラスが Class を継承するときに使います。#Class は、インスタンスを生成するとき、SBPP_Create の引数に渡します。どちらも後述します。
ここからは、Personクラスを例に進めます。Personクラスはフィールドとして、文字列型の氏名と、整数型の年齢をもつことにします。
フィールドを、定数で宣言します。
- @Person_Global
- enum\
- #Person_base=#Object_all,\
- #Person_name$,\
- #Person_age,\
- #Person_all
- const #Person=#Object+”B$%”
enum で定義した変数でフィールドの種類を定義しています。あとでインスタンスを生成して情報を取得・設定するとき、最後の all 以外の定数を使います。
最初のフィールドは特別で、名前を base とします。これはスーパークラスを表します。
最初の base には上のように、イコールに続けて継承するクラスを指定しなければなりません。たとえば継承するクラスが BaseClass の場合は #BaseClass_all という形で指定します。特にクラスを継承しないときは、必ず #Object_all を指定します。つまり、Objectはすべてのクラスが継承しています。
最後の定数で、メンバーの型を定義しています。スーパークラスの定数に追加する形で定義します。1文字1フィールドで、次のような意味を持ちます。変数名のサフィックスと一緒です。
文字 | 型 |
---|---|
% | 整数型 |
# | 実数型 |
$ | 文字列型 |
注意点として、この型のリストは B ではじめます。
コンストラクタは次のように作ります。
- common def Person(name$,age)
- dim this=SBPP_Create(#Person,”Person”,”Object”)
- SBPP_Set this,#Person_name$,name$
- SBPP_Set this,#Person_age,age
- return this
- end
SBPP_Create でインスタンスの領域を確保します。引数には、先ほどの型のリストと、自分のクラス名とスーパークラス名を指定します。
SBPP_Set でインスタンスのフィールドに値を設定します。
そして this が生成されたインスタンスです。最後に this を返すのもポイントです。
デストラクタは次のように作ります。SBPP_Dispose でインスタンスを削除したとき、自動的に呼ばれます。スーパークラスにデストラクタがある場合は、明示的に呼ばなければいけません。
- common def Person_Dispose this
- ’...
- end
あいさつを表示するメソッドを作ってみます。
- common def Person_Greet this
- dim name$=SBPP_Get(this,#Person_name$)
- dim age=SBPP_Get(this,#Person_age)
- print ”どうも!”;age;”歳の”;name$;”です!”
- end
フィールドの値の取得には SBPP_Get を使います。必ず第1引数にインスタンスを渡せるようにします。
Personのインスタンスを生成するには先ほどのコンストラクタを呼びます。
- dim saito=Person(”Ichiro Saito”,20)
- Person_Greet saito
使い終わったインスタンスは SBPP_Dispose で削除します。デストラクタが自動的に呼ばれます。
- SBPP_Dispose saito
この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)