私はアプリケーションアーキテクチャに次の問題があり、それを解決したいと思っています(多くのテキストで申し訳ありません)。
私はゲームエンジンのプロトタイプを作成していて、基本抽象クラスを持っていAbstractRenderer
ます(C ++構文を使用しますが、それでも問題は一般的です)。
このレンダラーの派生実装がいくつかあると仮定します。たとえばDirectxRenderer
、とOpenglRenderer
。
さて、これらのレンダラーの1つ(DirectXベースに固執しましょう)だけが、IDirect3D9Device* m_device;
明らかにこの時点ですべてが正常であるというメンバーを持っているとしましょう-m_device
内部で使用DirectxRenderer
され、抽象スーパークラスで公開されるべきではありませんAbstractRenderer
。
たとえば、抽象的なレンダリングインターフェイスも追加しますIRenderable
。それは単に1つの純粋な仮想メソッドを意味しますvirtual void Render(AbstractRenderer* renderer) const = 0;
そして、これはいくつかの問題が始まる場所です。あるシーンをモデリングしていると仮定すると、このシーンにはおそらくいくつかの幾何学的オブジェクトが含まれます。
抽象スーパークラスAbstractGeometricalObject
と派生DirectXベースの実装を作成しますDirectxGeometricalObject
。2つ目は、DirectX固有の頂点およびインデックスバッファーへのポインターを格納する役割を果たします。
今-問題。
AbstractGeometricalObject
論理的にレンダリング可能IRenderable
であるため、明らかにインターフェイスを派生させる必要があります。
私DirectxGeometricalObject
がから派生した場合、最初のものにはメソッドが含まれているAbstractGeometricalObject
はずであり、そのようなものはいくつかの問題を引き起こします。virtual void Render(AbstractRenderer* renderer) const { ... }
Abstract...
より良い説明については、コードを参照してください。
そして今のところ、私のクラスは次のように見えます。
class AbstractGeometricalObject : public IRenderable {
virtual void Render(AbstractRenderer* renderer) const { ... }
};
class DirectxGeometricalObject : public AbstractGeometricalObject {
virtual void Render(AbstractRenderer* renderer) const {
// I think it's ok to assume that in 99 / 100 cases the renderer
// would be a valid DirectxRenderer object
// Assume that rendering a DirectxGeometricalObject requires
// the renderer to be a DirectxRenderer, but not an AbstractRenderer
// (it could utilize some DX-specific settings, class members, etc
// This means that I would have to ***downcast*** here and this seems really
// bad to me, because it means that this architecture sucks
renderer = dynamic_cast<DirectxRenderer*>(renderer);
// Use the DirectX capabilities, that's can't be taken out
// to the AbstractRenderer superclass
renderer.DirectxSpecificFoo(...);
}
おそらく心配しすぎていることはわかっていますが、このような単純なケースでのこのダウンキャストは、アプリケーションが大きくなると、多くのダウンキャストを強制される可能性があることを意味します。
絶対に避けたいので、デザインの面でもっと良いアドバイスをお願いします/私の間違いを指摘してください。
ありがとうございました