2011-11-05 53 views
2

因此,我使用基類DisplayObject設置了此係統。 它有一個Render方法和其他DisplayObjects的列表,因爲它是孩子。它還包含有關各種矩陣轉換的數據,但我不包含有關實際圖形的數據。這就是爲什麼Render方法是虛擬的。在虛擬方法的所有覆蓋之後執行代碼

然後我有2個班。 ColoredShapeTexturedShape各自從DisplayObject繼承和重寫Render方法用一個新方法開始

base.Render(); 

,然後做繪圖代碼。

我現在想是調用該對象的所有孩子的Render後的渲染父已完成。所以這是我的問題。如果我做

foreach (var child in Children) child.Render(); 

DisplayObject類的Render方法結束的覆蓋是之前它會被執行,因爲它是base.Render()通話的一部分,如果我把這些代碼在子類中,而不是,單獨的DisplayObject就會失去該功能,並強制所有將來從其繼承的子類手動實現該功能。

回答

1

你想要的是抽象方法模式。換句話說,不要讓你的渲染方法虛擬箱子渲染調用的另一種方法(虛擬或抽象),所以渲染看起來像這樣:

public void Render() 
{ 
    DoRender() 

    foreach (var child in _children) 
    { 
     child.Render(); 
    } 
} 

protected virtual void DoRender() 
{ 
} 
1

斯普利特代碼,以便「使自己」是從「渲染兒」獨立:

public void Render() { 
    OnRender(); 
    foreach(var child in Children) child.Render(); 
} 
protected abstract void OnRender(); 

的子類提供OnRender,這使得自我,而不是孩子。這是由Render處理。在某些情況下,將Render設爲virtual可能會很有用,以便的子類可以在需要不同孩子行爲的情況下對其進行控制。