- 426 名前:デフォルトの名無しさん mailto:sage [2016/08/28(日) 15:30:05.25 ID:+mkoP4gZ.net]
- 次に今回の実装方式について、
(α)についてはその通り。 (β)については「継承」が出来ればそっちの方がいいが、無理なら「内包」でも問題ない。(β+) コンストラクタでShapeを与えて内包したRectangleDraw、CircleDrawクラスを作り、 ShapeDrawクラスを継承する。 つまりラッパーオブジェクトを作成して同階層構成でXXXXDrawクラスを構成する。 これだと自前クラスなので何も問題なくOOPできるが、 コンストラクタ内では1回だけ is XXXX でswitchしなければならない。 それでも毎回記述が必要な(γ)よりマシ。 > クラス内にフィールドで保持してもいいが 後の文を読む限りこれはばらしてということだと思うが、 (β+)はばらさすにそのまま保持する。(フィールドとして Shape shapeを持つ) そして各Drawメソッドからは this.shape.xxxxとしてアクセスする。 こうすれば、アクセサに関してもShapeの定義そのままであり、追加記述は必要ない。 これにより、外枠以外の本質的記述が(γ)に対して増えることはない。 これでどうだ? 最後に以下だが、 > 実行時に解決するのは非常にコストが高い。 > 多分仮想関数を理解してないんだと思うけど、静的メソッドはC++やC#の方式だと仮想関数テーブルに無いので仮想関数になり得ない > また、呼び出しに失敗する可能性があるというリスクがあり、静的型付け言語の良さを殺している これはいろいろだいぶ違う気がするが、確認も時間がかかるし、後回しでいい。
|

|