私は 3D エンジンを開発しています。次のインターフェイス クラスがあるとします。
class IA {
public:
virtual ~IA() {}
virtual void doSomething() =0;
};
class IB {
public:
virtual ~IB() {}
virtual void bindA( IA* ) =0;
};
タイプ「IA」または「IB」のオブジェクトを取得したい場合は、使用されているバックエンド API (OpenGL など) に依存するファクトリから取得する必要があります。関数 IB::bindA(IA*) は IA の実装からデータにアクセスする必要があり、それを実現するにはstatic_cast
、実装クラスに対して a を実行し、その要素に直接アクセスします。
のこの特定の使用法についてどう思うか知りたいのですがstatic_cast
、設計が悪いと思いますか? それとも大丈夫だと思いますか?
エンジンはどのバックエンド API を使用しても同じインターフェイスを提供する必要があるため、IA から IB が必要とするものを事前に知ることができないため、仮想関数を使用してこれを実現できるとは思いません。
ありがとう
編集
エンジンには次の 2 つのクラスがあります。
class IHardwareBuffer {
public:
virtual ~IHardwareBuffer() {}
virtual void allocate( .... ) =0;
virtual void upload( .... ) =0;
};
と
class IMesh {
public:
virtual ~IMesh() {}
virtual bindBuffer( IHardwareBuffer* ) =0;
...
};
IMesh と IHardwareBuffer クラスを一緒に「マージ」することはできますが、HardwareBuffer は頂点データを含むメモリの「愚かな」部分であり、メッシュは他のデータを含む 1 つまたは 2 つの HardwareBuffers であるため、あまり意味がありません。それら、頂点フォーマット、マテリアルなど。それらを別々のクラスにすることで、クライアント コードで複数のメッシュが共通の HardwareBuffer などを共有できるようになります。