0

私はさまざまなターゲット向けのクロスプラットフォーム UI ツールキットを作成していますが、その一部は埋め込まれています。これらのプラットフォームの一部は「保持」レンダリング モードをサポートし、一部はより「即時」であるため、ビジュアルには 2 つのツリーがあると考えています - 疑似コード:

abstract class Visual 
{
    Visual( Widget widget ) { this.widget = widget; }
}

abstract class RetainedVisual : Visual
{
    abstract void Setup( Renderer r );
    abstract void Teardown( Renderer r );
}

abstract class ImmediateVisual : Visual
{
    abstract void Paint( Renderer r );
}

ここまでは順調ですね。しかしContainerVisual、ウィジェット階層をエンコードするクラスもあります。

abstract class ContainerVisual : Visual
{
    void AddChild( Visual child ) {}
}

これは、肥大化したように見え始めている anImmediateContainerVisualおよび aクラスを持つことを強制します。RetainedContainerVisualより良いデザインのアイデアはありますか?

4

2 に答える 2

1

最良の代替手段は、3 つのクラスを同じ Visual クラスに結合することです。

class Visual {
   Visual(Widget w);
   bool SupportsSetupTearDown();
   bool SupportsPaint();
   abstract void Setup(Renderer r);
   abstract void TearDown(Renderer r);
   abstract void Paint(Renderer r);
};

そうすれば、コンテナ ウィジェットに問題はありません。すべてのビジュアルは両方のレンダリング方法を実装する必要があり、ターゲットが変更されると、システムは異なる関数の呼び出しを開始します。これにより、条件付きで 1 つの方法を実装しないことも可能になり、SetupTearDown から Paint および Paint から SetupTearDown に変換する特別なビジュアルを構築できます。

于 2013-03-19T10:25:38.553 に答える
0

より多くの情報がなければ、どちらに進むべきかを判断するのは困難です: 機能面での保持/即時の違いは何ですか? コンテナは何をしますか?

それでも、C++ では、Container のようなものにクラス テンプレートを使用することを検討できます。

template <typename BaseType>
class ContainerVisual : public BaseType
{
public:
    void AddChild(BaseType & /*or smart pointer or whatever*/ child ) {}
}
于 2013-03-19T11:42:21.830 に答える