2013-03-19 94 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