0

C++ (SDL を使用) で小さくてシンプルな GUI を作成しようとしています。柔軟なソリューションを実現するために、複合パターンを試しています。

Component オブジェクトを含む Widget クラスがあります。たとえば、 PaintingComponent があります。ボックスを描画する場合は、PaintingComponent を継承する PaintingBoxComponent を使用します。

理想的な Widget クラスは次のようになります。

Class Widget
{
  private:
  vector<Component*> myComponents;

  public:
  // A small number of methods able to communicate with the component 
  // without knowing their types
}

私の質問は簡単です。必要なときにこのコンポーネントを有効にする最善の方法は何ですか?

最初に Widget クラスの「表示」機能を使用しました。しかし、次の 2 つの問題があります。

1°) ウィジェットの特定のコンポーネントを PaintingComponent として宣言する必要があるため、ウィジェットの「コンポーネント」の純粋なポリモーフィズムが失われています。ウィジェットを表示する必要があるのは論理的であるため、これに対処できます。

2°) さらに厄介なことに、メイン プログラムと PaintComponent の間で情報を渡す必要があります。SDL_Surface* スクリーンを PaintingComponent に渡し、描画した画像を描画するか、描画した画像を受け取る必要があるオブジェクトへの参照をコンポーネントに与えます (このオブジェクトは画像を描画します)スクリーン)。どちらの場合も、Widget はデータを処理する必要があり、SDL_Surface* が何であるかを知る必要があります。疎結合を失いつつありますが、それは望ましくありません。

そこで、「ビジター」パターンを使おうと考えたのですが、慣れないので実装する前にアドバイスをいただきたいです。

この場合、どのように柔軟で確実なソリューションを進めますか? 前もって感謝します !

4

1 に答える 1

1

後でグラフィック システムを変更する予定がある場合は、このパターンを実装できます。訪問者はルート ノードに移動し、次にすべての子に再帰的に移動し、何らかの面 (訪問者自身のみが認識) にそれらを描画します。それを使用して「表示リスト」を収集し、描画する前に最適化できます(たとえば、OpenGL では z ソートを適用します(z を下げる)。

于 2010-09-24T10:51:45.137 に答える