読者です 読者をやめる 読者になる 読者になる

インターフェイスに全てのオブジェクトが行えないメンバ関数を追加していくときの違和感は異常

何を抽象化しようとして、
例えば、
非仮想関数を束ねて、例えば、
図形の
ObjectSphere

ObjectBox、
はたまた、ObjectRenderXXXX
なんかを統合して、
ObjectShapeとして、
メソッドにvirtualを付けて
メソッドをインターフェイスに公開する時の違和感は異常。


要するに、こうすると基底にはできない操作を公開することになる。
これは継承方式としてあるまじき行為ですらある。


描画を行いたいものは沢山あって、
描画形状も様々なものがある。
要するに、単なる箱や球体から、
キャラクタの形状をしているもの、
はたまたビルボードなど。
これらに対して適切で統合されたインターフェイスをObjectShapeに集約すれば
すべてのオブジェクトに対して可能である操作しかもたない役立たずクラスか、
可能ではない操作をObjectShapeに追加し神様クラスになることがよくある。


例えば、全てのオブジェクトがモデルやテクスチャを欲するわけではないが、
モデルやテクスチャをセットするインターフェイスがなければObjectShapeはタダの屑になってしまう。
かといって、単なる球体はモデルを要求しない。
球体のオブジェクトにモデルを設定しようとしたらそれはエラーだ。


モデルをセットする段階で内部でそれが何なのか、を確定させるという方法もあるのだけれど、
そうすると、
AとBモデルを扱えるクラス
Aしか扱えないが軽いクラス
AとBとCモデルを扱えるが多機能で重いクラス
などが確定できない。(ユーザに指定させるという手はある


確定したあとに使えるその形状だけに有効な操作(メソッド)の問題もある。


なので、結局神様クラスに落ち着きがちだが、
神様クラス(神様インターフェイス)は全てのインターフェイスをvirtualで持っていてそれはどうにも解せない。
要求を満たせないインターフェイスを実装しなければならなくなるからだ。
(概ねそれはassertになるだろう)

Mediatorを使って、というのはちょいと手間な操作だ。
さて、どうしようかな。
こんなことでいつも悩んでいる気がする。