Item
クラスの階層があるとしましょう:Rectangle, Circle, Triangle
。それらを描画できるようにしたいので、私の最初の可能性はDraw()
それぞれに仮想メソッドを追加することです:
class Item {
public:
virtual ~Item();
virtual void Draw() =0;
};
ただし、コアライブラリには基本的な表現しか含まれていないのに、描画機能を別のDrawライブラリに分割したいと思います。私が考えることができるいくつかの可能性があります:
1-のDrawManager
リストを受け取り、何をすべきかを計算Item
するdynamic_cast<>
ために使用する必要がある:
class DrawManager {
void draw(ItemList& items) {
FOREACH(Item* item, items) {
if (dynamic_cast<Rectangle*>(item)) {
drawRectangle();
} else if (dynamic_cast<Circle*>(item)) {
drawCircle();
} ....
}
}
};
これはRTTIに依存し、1つのクラスが階層内のすべての項目を認識するように強制するため、理想的ではありません。
2-もう1つのアプローチは、描画の責任をItemDrawer
階層に任せることです(RectangleDrawer
など)。
class Item {
virtual Drawer* GetDrawer() =0;
}
class Rectangle : public Item {
public:
virtual Drawer* GetDrawer() {return new RectangleDrawer(this); }
}
これにより、Itemの基本表現と描画用コードの間の関心の分離が実現します。ただし、問題は、Itemクラスが描画クラスに依存していることです。
この描画コードを別のライブラリに分離するにはどうすればよいですか?Itemsが何らかの説明のファクトリクラスを返す解決策はありますか?ただし、コアライブラリが描画ライブラリに依存しないように、これをどのように定義できますか?