プチコン4 まとめWiki

Toukou/SBplusplus の変更点

パンくずリスト


#title(オブジェクト指向ライブラリ)
#contents
// ↑↑↑↑ この2行は削除しないでください。 ↑↑↑↑
// ←「//」で始まる行はコメントです。ページ本文には反映されません。

// --------------------------------------------------------------------------------------------
// ・以下に作品の情報を書きます。

2020年7月18日投稿
// / 2019年×月×日更新
/ 投稿者 : りょうたんぽ
/ &tag(投稿プログラム,ツール,ライブラリ,オブジェクト指向);

// ・投稿年月日は、いま投稿しようとしている今日の日付を半角数字で記入してください。
//   投稿プログラムページの「投稿された順」で上位に表示されます。
// ・作品の公開キーをアップデートしたら、更新日を記入して、頭の「//」2文字を取り除くと
//   「アップデート順」で上位に表示されます。(ページの更新だけで更新日の記入をするのは禁止です)
// ・投稿者名は、投稿プログラム一覧に表示するために使用します。匿名(名無しさん)でも可能です
// ・&tag() 内にコンマ区切りで、作品に関するタグ(任意の単語)を並べると、
//   同じタグがついた作品を検索できます。
// --------------------------------------------------------------------------------------------


// --------------------------------------------------------------------------------------------
// ここから先に概要など、作品の説明を書きます。
// ・* や ** や *** ではじまると見出しになります。* が多いほど階層が深くなります。
// ・[#英数字] はページ内リンクに使用されるキーワードとなりますが、消してもかまいません。
//   消したりなかったりの場合は、ランダムな文字列が自動で付与されます。
//   逆に、ページ内に同じキーワードが複数ある場合、目次からのリンクが正常に動きません。
// --------------------------------------------------------------------------------------------

* 概要 [#Overview]

オブジェクト指向''もどき''のためのライブラリ!! ……のテスト、というかデモ。プロジェクト名 OOPTEST。まだまだ途中だけど、一応使える形にはなってます。これからも更新します!

実はこのライブラリは「そのまま利用するライブラリ」として開発しているわけではありません。そのうち SB++ なる言語を作って、プチコン4で動かせるように変換し、その変換されたプログラムが利用するランタイムライブラリにしようと考えてます。そのまま使うには若干不便だけど、特に問題はないです!実際に、この後出て来る[[サンプル>#Sample]]ではライブラリをそのまま利用してます。コンバータが完成して SB++ プログラムが変換されたとき、そのような感じのプログラムになります。多分。

ライブラリファイル名は SBPLUSPLUS.LIB となってます。



* ガイド [#Guide]


** 宣言 [#Declaration]

ライブラリを使うために、まず適当なスロットにライブラリを読み込みます。さらに、Objectクラスの宣言が必要です。

#basic{{
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 の引数に渡します。どちらも後述します。


** クラスのメンバを定義 [#DefineClassMember]

ここからは、Personクラスを例に進めます。Personクラスはフィールドとして、文字列型の氏名と、整数型の年齢をもつことにします。

フィールドを、定数で宣言します。

#basic{{
@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 ではじめます。

** コンストラクタの定義 [#DefineConstructor]

コンストラクタは次のように作ります。

#basic{{
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 を返すのもポイントです。


** デストラクタの定義 [#DefineDestructor]

デストラクタは次のように作ります。SBPP_Dispose でインスタンスを削除したとき、自動的に呼ばれます。スーパークラスにデストラクタがある場合は、明示的に呼ばなければいけません。

#basic{{
common def Person_Dispose this
 '...
end
}}


** メソッドの定義 [#DefineMethods]

あいさつを表示するメソッドを作ってみます。

#basic{{
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引数にインスタンスを渡せるようにします。


** インスタンスの生成と利用 [#CreateInstance]

Personのインスタンスを生成するには先ほどのコンストラクタを呼びます。

#basic{{
dim saito=Person("Ichiro Saito",20)

Person_Greet saito
}}


** インスタンスの削除 [#DisposeInstance]

使い終わったインスタンスは SBPP_Dispose で削除します。デストラクタが自動的に呼ばれます。

#basic{{
SBPP_Dispose saito
}}


/////////////////////////////////


// * スクリーンショット・動画 
// 動作しているところを撮影した写真や動画があれば貼り付けてください。

// ページを作成すると、画像の添付ができます。(作成する前はできません)
// 作成後のページの右上の「Wikiの機能」→「画像を添付する」からアップロードできます。
// (添付ファイルはページごとに別個に管理されています。必ず作成後のページに添付してください)
// 画像をアップロードしたら、以下の書式でページ内に貼り付けられます。
// #ref(添付ファイル名)

// 以下の書式で、YouTube やニコニコ動画を貼り付けられます。
// #youtube(0HWX7kovgY8)
// #nicovideo(sm13684820)

// Twitter の投稿は以下のように書けば埋め込めます。
// #tweet(https://twitter.com/hosiken/status/615920904929849344)


/////////////////////////////////


* 公開キー [#PublicKey]

#ptcmid(4N3Q44344)


/////////////////////////////////

// --------------------------------------------------------------------------------------------
// もしコメントを募集したくないなら、ここから下は削除してください
// --------------------------------------------------------------------------------------------

* コメント [#Comments]
この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は[[掲示板>Board]]へ)
- ''キルル2'' : すごそう (&new{2020/08/15 (土) 03:58:41};)

#comment

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.048 秒 | ログイン
Copyright(C) 2011-2019 プチコンまとめWiki