我有一个基类和几个从中派生出来的具体类。让我们说它看起来像这样:
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是一个很大的开放空间,有一堆具体的对象,它们来自于它周围的Base。在此视图中,您只需要通用id
和baseVariable
属性即可获得显示通用对象所需的内容。如果双击其中一个对象,它将弹出一个窗口,您可以在其中编辑其中的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 :(得分:1)
一种方法是建立一个工厂,根据模型类型注册视图类型:
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时轻松使用工厂:
tabs.add(ViewFactory.CreateView(object));