Отображение динамического интерфейса на основе конкретного типа объекта? - PullRequest
1 голос
/ 23 марта 2011

У меня есть базовый класс и несколько конкретных классов, которые вытекают из него. Скажем так, это выглядит так:

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;
}

Допустим, пользовательский интерфейс представляет собой большое открытое пространство с кучей конкретных объектов, происходящих из базы, плавающей вокруг него. В этом представлении все, что вам нужно, это общие свойства id и baseVariable, чтобы получить то, что вам нужно для отображения универсальных объектов. Если дважды щелкнуть один из объектов, появится всплывающее окно, в котором вы сможете редактировать все свойства базовых и бетонных объектов внутри.

В этом окне я хочу иметь динамически загружаемые вкладки, основанные на типе конкретного объекта, который у меня есть, и статически загружаемые вкладки, которые используются для изменения общих свойств 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);
            ...

Есть идеи или предложения? Извините за длинный вопрос. Заранее спасибо.

1 Ответ

1 голос
/ 23 марта 2011

Одним из способов является создание фабрики, в которой вы регистрируете типы представлений на основе типа модели:

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));
...