2011-03-23 51 views
1

我有一個基類和幾個從它派生的具體類。讓我們只說這看起來是這樣的:顯示基於具體對象類型的動態用戶界面?

abstract class Base 
{ 
    public int id; 
    public string baseVariable; 
} 

class ConcreteA extends Base 
{ 
    public string propertyA; 
    public float propertyB; 
} 

class ConcreteB extends Base 
{ 
    public decimal propertyC; 
    public RandomClass propertyD; 
} 

讓剛剛說的UI是一束從基地在它漂浮得出具體對象的一個​​大的開放空間。在這個視圖中,你需要的是一般的idbaseVariable屬性來獲得你需要顯示的通用對象。如果雙擊其中一個對象,它會彈出一個窗口,您可以在其中編輯其中的Base和Concrete對象的所有屬性。

在那個窗口中,我希望根據具體對象的類型動態加載選項卡,以及用於修改常用Base屬性的靜態加載選項卡。有沒有一個很好的設計模式來實現這樣的事情?

好像我應該避免這種情況:

class PopUpWindow 
{ 
    public PopUpWindow(object:Base) 
    { 
     tabs.add(BaseTab); 

     switch(typeOf(object)) 
     { 
      case ConcreteA: 
       tabs.add(ConcreteATab); 
      case ConcreteB: 
       tabs.add(ConcreteBTab); 
     } 
    } 
} 

但我也並不認爲我應該在對象本身被混合UI的東西,像這樣:

public PopUpWindow(object:Base) 
     { 
      tabs.add(BaseTab); 
      tabs.addAll(object.TabsToShowOnEdit); 
      ... 

任何意見或建議, ?很抱歉,這個冗長的問題。提前致謝。

+0

設計模式是:

class ViewFactory { // Can be populated from outside this class Dictionary<Type, Type> viewTypeByModelType; Control CreateView(Object model) { return (Control)Activator.CreateInstance(viewTypeByModelType[model.GetType()]); } } 

然後你可以填充你的PopupWindow時,容易出現使用工廠一個非常不同的概念。 http://en.wikipedia.org/wiki/Design_pattern_(computer_science) – 2011-03-23 13:34:41

+0

@pavelrappo:不同於什麼?我想知道是否有適用於這種情況的設計模式。例如,似乎工廠模式在某種程度上可能有用,但我不確定應用它的好方法是什麼。 – Ocelot20 2011-03-23 13:47:17

回答

1

一種方法是在其中您根據模型類型註冊視圖類型工廠:

tabs.add(ViewFactory.CreateView(object));