05. SNAP!でオブジェクト指向(4/2)
P.51 B. Messages and Dispatch Procedures
挙動をメッセージで制御可能なプログラム
askブロック作成上の注意点:
・ブロック引数の型
1つ目 コマンド(インライン) を指定
2つ目 通常の全タイプ
3つ目 複数の引数
・非リング化
callブロック(・・・を呼ぶ ブロック)は、引数に他のブロックをセットすると自動的にリング化してしまう。
今回利用するブロックは、リング化されたプログラムを返すモニター(関数)なので、二重にリング化されてしまい、そのままでは不都合。
自動的にリング化された部分を、右クリックして 非リング化 する。
・引数で呼ぶ と 引数リストで呼ぶ の違い
外側の 呼ぶブロック を引数リストで呼ぶように修正。第3パラメータのブロックを 呼ぶブロック の▲部分にドラッグ&ドロップするとブロックのタイプが変更される。
このページまでの作業結果を保存したファイルを、このページに添付しておくので、ダウンロードして利用するとよい。
P.52 C. Inheritance via Delegation
移譲を経由して継承を実現する。
移譲: あるオブジェクトに対する処理の依頼(メッセージ)を、別のオブジェクトに受け渡して処理をそのオブジェクトに任せること
継承: オブジェクト間に親子関係がある時、子のオブジェクトが親のオブジェクトの機能を利用して処理できる。機能の継承。
例)
カウンターオブジェクトを親とする、7回目にブザーを鳴らすオブジェクトを作成する。
※buzzer オブジェクトの動作確認で、 ask する際にダミーの引数を指定しないとエラーが出る。
上記のエラーの原因は、SNAP!の仕様。
https://github.com/jmoenig/Snap--Build-Your-Own-Blocks/issues/1245
リング化されたブロックの空の可変長引数リストは、暗黙の書式パラメータ(リングの引数)になる。
リング内のブロックに、空の可変長引数がある場合、リングの呼び出し側で引数を与える必要がある。未指定にはできない。
P.52の buzzer ブロックの定義を変更して対応する。
ask ブロックの引数にダミーの空スロットを追加
可変長引数ブロックの実験:
不具合に対して、ask の仕様を変更して対応する。
修正前の ask の引数 オブジェクト メソッド 可変長引数(0~複数個)
修正後の ask の引数 オブジェクト メソッド 引数リスト(1個。リスト内に複数のパラメータを列挙)
あわせて counter の仕様も変更する。
修正前 メソッドの引数は、呼び出し元の可変長引数からリングの引数に割り当てられたものを使用
修正後 メソッドの引数は、呼び出し元の引数リストからリングの引数(1個)に渡されたものを取り出して使用
第5回SNAP4回目の終了分とaskの仕様変更まで(添付ファイル参照)
2017年度は概略のみ解説:
P.52 D. An Implementation of Prototyping OOP
プロトタイプベースのOOPの実装
OOPのクラスを利用しない。
最初に作成したオブジェクト自体でクラスを表現する。
オブジェクトのインスタンスの作成は、元のオブジェクトのクローンで実現する。
クラスベースのオブジェクト指向
プロトタイプベースのオブジェクト指向
Viscuit を例に説明する:
P.55まで。頑張って作成する。
SNAP!の課題(4/2回目) として保存したファイルをWebclassに提出。
第5回SNAP4回目の終了分まで(添付ファイルあり)
補足内容
・引数固定のブロック
・リストを引数に取るブロック
・可変長引数のブロック
・畳み込み演算