C++ C++;抽象用户界面设计

C++ C++;抽象用户界面设计,c++,oop,model-view-controller,user-interface,C++,Oop,Model View Controller,User Interface,我正在为各种目标编写一个跨平台UI工具包,其中一些是嵌入式的。其中一些平台支持“保留”渲染模式,而其中一些更为“即时”,因此我认为对于我的视觉效果,我有两棵树——伪代码: abstract class Visual { Visual( Widget widget ) { this.widget = widget; } } abstract class RetainedVisual : Visual { abstract void Setup( Renderer r );

我正在为各种目标编写一个跨平台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 ) {}
}

这迫使我拥有了一个
即时的containervisual
和一个
保留的containervisual
类,这些类开始显得臃肿起来。更好的设计理念?

最好的选择是将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。

如果没有更多信息,很难决定采用哪种方式:保留/立即在功能上有什么区别?容器做什么

但是,在C++中,您可能会考虑使用类模板来处理容器:

之类的东西。
template <typename BaseType>
class ContainerVisual : public BaseType
{
public:
    void AddChild(BaseType & /*or smart pointer or whatever*/ child ) {}
}
模板
类ContainerVisual:公共基类型
{
公众:
void AddChild(BaseType&/*或智能指针或任何*/child){}
}

于是出现了“伪代码”一词,约阿希姆。最终设计必须在C++中实现(所以:没有反射或其他狡猾的东西)。保留是否意味着缓冲?此外,您还没有说明
RetainedVisual
ImmediateVisual
之间的功能区别是什么,或者它们的共同点是什么(它们共享一个基类,但显然没有虚拟方法或数据)。“Retained”意味着您将图形提交到上下文中,然后忘记它们(直到某些内容发生变化)。因此,“设置”将图形一次推入渲染器。而“拆卸”会将其移除。“立即”是指在渲染器中每帧连续绘制一次图形。你们不需要使这些东西失效,因为它们通常都会被重新绘制。谢谢——这是我的方向,但我对这些“厨房水槽”界面感到有点不舒服,它们看起来不太好。另一方面,班级膨胀似乎也不是很好。岩石和坚硬的地方。在保留模式下,您可以调用安装程序(渲染器r)来绘制图形,然后调用拆卸(渲染器r)来删除它们。该框架处理刷新和重新绘制,因为它缓存所有原语的位置及其外观。在即时模式下,每帧调用一次绘制(渲染器r)——这是较低的级别,通常只涉及将像素推送到帧缓冲区,而没有基本体的概念。您不必担心无效,因为您通常会重新绘制。容器小部件包含子小部件,因此必须将正确的接口传播给子部件。