C++相談室 Part4
■ このスレッドは過去ログ倉庫に格納されています
0484デフォルトの名無しさん
NGNG良いクラス名が思いつかなくて鬱なんだけど、たとえばこんな感じ。
struct IGraphicBuffer
{
virtual void WriteRawData(char *data, size_t size) = 0;
};
struct IGraphicLoader
{
virtual bool Load(IGraphicBuffer& obj, const string& file) = 0;
};
class CGraphic : public IGraphicBuffer
{
vector<IGraphicLoader*> m_pLoaders;
typedef vector<IGraphicLoader*> TLoaderIterator;
// こいつは public でも private でも、好きなように
void WriteRawData(char *data, size_t size);
public:
bool LoadGraphic(const string& file)
{
for (TLoaderIterator i = m_pLoaders.begin(); i != m_pLoaders.end(); ++i)
if (i->Load(*this, file))
return true;
return false;
}
};
class CBitmapLoader : public IGraphicLoader
{
bool Load(IGraphicBuffer& obj, const string& file);
};
Concrete Loader に対して CGraphicLoader 自身ではなく、CGraphicLoader の内で公開したいメソッド
だけまとめた IGraphicBuffer を渡しておくのがミソ。
IGraphicBuffer, IGraphicLoader はがっちり結びつくけど、実装である CGraphic, CBitmapLoader
の間は公開インターフェースを通してのみの緩い結びつきになる。こうしておけばインターフェース
を変えない限りは CGraphic, CBitmapLoader は独立に拡張できるのが利点。
事例
XXX という画像フォーマットでは、最終的に必要なデータのサイズがファイルを最後まで読んでみ
ないと分からない。でも、とりあえず読めた分から CGraphic のバッファに書き込んでしまいたい。
(たとえばブラウザの画像表示に使うとかの理由で)
そこで、CXXXLoader にはバッファサイズを最初に確定する IGraphicLoader ではなく、バッファに
追加書き込みが出来る IGraphicLoader2 という別のインターフェースを提供する必要がある
みたいな要求が出てきたときに、その IGraphicLoader2 を CGraphic に実装して CXXXLoader に公開
すれば、これまでの Loader には一切影響を与えずに済むでしょ。
■ このスレッドは過去ログ倉庫に格納されています