今回は、委譲のパターンで書いてみた。継承のパターンではない。
まずは、既存仕様の立場を取るAdapteeクラス。これが変更できないためにAdapterを使う。
そして、Adapterのクラス。特徴は以下の通り。class Adaptee operations public adaptee : () ==> nat adaptee() == return 1; end Adaptee
- 既存仕様である「Adaptee」を使うために、ClientとAdapteeをつなげるクラス
- 委譲の形で記述しているため、インスタンス変数として、Adapteeを持つ
- 継承の形で記述するなら、TargetとAdapteeを多重継承した形
※継承の形で記述すると、ClientにAdapteeの情報が公開されるため、委譲の形で記述した方が良い
次はクライアントに見えるTargetクラスは以下の通り。JavaとかだとInterfaceで書くんだろうけど、VDM++にはInterfaceがないので、is subclass responsibilityの操作だけの、擬似抽象クラスとした。class Adapter is subclass of Target instance variables adpt : Adaptee := new Adaptee(); operations public returnNat : () ==> nat returnNat() == return adpt.adaptee(); end Adapter
で、最後にClientクラス。Adapteeクラスを使いたいんだけど、どうしてもreturnNatという操作名で使いたいとする。class Target operations public returnNat : () ==> nat returnNat() == is subclass responsibility; end Target
上記2つのクラスをVDMToolsで動作させるには、VDMToolsのインタープリタで以下のコマンドを入力してください。class Client instance variables a : Target; operations public t : () ==> nat t() == ( a := new Adapter(); return a.returnNat(); ); end Client
>> init >> print new Client().t()
0 コメント:
コメントを投稿