OK、それはもうコメントに収まりません。「基本的に契約」の場合は作成してください!例えば:
struct IDeliverSDLSurface {
virtual SDL_Surface* GetSurface() const = 0;
virtual ~IDeliverSDLSurface() = default;
};
class A : public IDeliverSDLSurface {
SDL_Surface* m_Surface;
// implements IDeliverSDLSurface
virtual SDL_Surface* GetSurface() const
{
return m_Surface;
}
// other stuff
};
class B : public IDeliverSDLSurface { /* etc */ };
// etc.
次に、中間層を記述します。ここで、サービスIDeliverSDLSurface*
はサーフェスを取得して適切な「エンジン」サービスに渡します。例:
namespace Intermediate {
void Foo(IDeliverSDLSurface* p_Object)
{
// call engine's Foo
Engine::Foo(p_Object->GetSurface());
}
void Bar(IDeliverSDLSurface* p_Object)
{
// call engine's Bar
Engine::Bar(p_Object->GetSurface());
}
// etc
}
その種のより洗練された(半自動)ディスパッチャーを書くこともできますが、あなたはその考えを理解します...クライアント側では、以下Intermediate
を実装するすべてのタイプのすべてのインスタンスで関数を呼び出すことができIDeliverSDLSurface
ます。
A tA;
Intermediate::Foo(&tA);
B tB;
Intermediate::Bar(&tB);
// etc...