2013-03-19 71 views
0

我正在为各种目标编写一个跨平台的UI工具包,其中一些已经嵌入。有些平台支持“保留”渲染模式,其中一些更是“立竿见影”,所以我想,我的视觉效果,我有两棵树 - 伪代码:C++抽象用户界面设计

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

哪种类型的力量我到具有ImmediateContainerVisualRetainedContainerVisual类这是开始显得臃肿。更好的设计理念?

+2

因此词“伪”,约阿希姆。最终设计必须在C++中实现(所以:没有反射或其他狡猾的东西)。 – 2013-03-19 09:47:45

+0

_retained_是否意味着缓冲?此外,您还没有说过RetainedVisual和ImmediateVisual之间的功能差异是什么,或者它们有什么共同之处(它们共享一个基类,但显然没有虚拟方法或数据)。 – Useless 2013-03-19 10:20:51

+0

“保留”意味着您将图形提交到上下文,然后忘记它们(直到发生变化)。所以“安装程序”将图形一次推入渲染器。和“拆解”将其删除。 “立即”意味着您不断在渲染器中每帧一次地绘制图形。你不需要使东西无效,因为它通常都会被重绘。 – 2013-03-19 11:12:46

回答

1

最佳选择是3类结合到相同的视觉类:

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的特殊视觉效果。

+0

谢谢 - 这是我前往的方式,但我对这些“厨房水槽”接口感到有点不舒服,它们看起来不太OO。另一方面,班级膨胀似乎也不是很好。岩石和硬地方。 – 2013-03-19 11:17:23

0

在没有更多信息的情况下很难决定怎么走:在功能方面保留/立即有什么区别?容器做什么?

但尽管如此,在C++中,你可能会考虑使用类模板之类的容器:

template <typename BaseType> 
class ContainerVisual : public BaseType 
{ 
public: 
    void AddChild(BaseType & /*or smart pointer or whatever*/ child) {} 
} 
+0

在保留模式下,您可以调用Setup(Renderer r)绘制图形,并使用Teardown(Renderer r)将其移除。该框架处理刷新和重绘,因为它缓存了所有原语的位置以及它们的外观。在即时模式下,每帧调用Paint(Renderer r) - 它的级别较低,通常只涉及将像素推送到帧缓冲区,而没有基元的概念。你不必担心无效,因为你总是重新绘制,本质上。 – 2013-03-19 11:47:52

+0

容器小部件包含子小部件,因此必须将正确的界面传播给子级。 – 2013-03-19 11:48:43