0

我正在为各种目标编写一个跨平台的 UI 工具包,其中一些是嵌入式的。其中一些平台支持“保留”渲染模式,其中一些更“即时”,所以我认为对于我的视觉效果我有两棵树 - 伪代码:

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 ) {}
}

哪种迫使我拥有一个ImmediateContainerVisual和一个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);
};

那么容器小部件就不会有任何问题。所有的视觉都应该实现这两种渲染方法,当目标改变时,系统将开始调用不同的函数。这也允许有条件地不实现一种方式,并且可以构建特殊的视觉效果,从 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 回答