Достижение состояния, как шаблон, не имея +3 сущностей? C # - PullRequest
0 голосов
/ 11 августа 2009

Вот проблема дизайна в псевдо-примере:

Это пользовательский элемент управления (UC) ASP.NET, который использует объект «Food» в качестве источника данных, и этот объект имеет свойство FoodType - «Veg» || "Nonveg".

Пользовательский элемент управления изменяет отображение пользовательского интерфейса в зависимости от свойства FoodType. В классе пользовательского элемента управления с выделенным кодом некоторые методы имеют одно и то же условие if / then / else: if (Food.FoodType == "Veg") ... else ...

Здесь я хотел бы использовать шаблон, подобный состоянию, чтобы класс пользовательского элемента управления с выделенным кодом содержал два внутренних / вложенных класса , т.е. класс "VegFood" и "NonvegFood " учебный класс. Теперь, допустим, класс NonvegFood будет содержать собственную реализацию логики.

Но, имея один интерфейс, два экземпляра класса (как вложенные), которые будут использоваться только в этом пользовательском элементе управления, могут быть перегружены. Кроме того, в UC отсутствует метод драйвера, в котором я могу вызывать связанные методы в одном блоке if, например, «DataBound» и «ItemCreated».

Тем не менее, возможно ли иметь шаблон типа State внутри класса UC? Возможно, два внутренних класса экземпляра внутри UC и как-нибудь, если я могу делегировать вызов одному из этих внутренних классов?

class UC : UserControl
{

    class VegFood
    {
        string DisplayName
        {
          get
          {
            return "Rice";
          }
        }       
    }

    class NonvegFood
    {
        string DisplayName
        {
          get
          {
            return "Chicken";
          }
        }       
    } 

    protected string DisplayName
    {
        get
        {
            return Instance.DisplayName;
        }
    }

    /*********** MAGIC Property ****************/
    private ? Instance
    {
        get
        {
           return ?;
        }
    }
}

1 Ответ

0 голосов
/ 11 августа 2009

Я не думаю, что наличие трех вложенных классов не является излишним дизайном, если это облегчает поддержку кода.

Я бы предложил абстрактный базовый класс State, который определяет контракт ваших штатов. Каждое государство будет наследовать от этого.

Расширенный пример кода:

class UC : UserControl
{

protected string DisplayName
{
    get
    {
        return Instance.DisplayName;
    }
}

/*********** MAGIC Property ****************/
private FoodState _instance = null;

private FoodState Instance
{
    get
    {
       if (_instance == null)
       {
           if (FoodType == "Veg")
           {
                 _instance = new VegFood();
           }
           else
           {
                 _instance = new NonvegFood();
           }
       }

       return _instance;
    }
}


abstract class FoodState
{
    abstract public string DisplayName {get;}
}

class VegFood : FoodState
{
    public string DisplayName
    {
      get
      {
        return "Rice";
      }
    }       
}

class NonvegFood : FoodState
{
    public string DisplayName
    {
      get
      {
        return "Chicken";
      }
    }       
}

}

Возможно, вам не нужно защищенное свойство DisplayName непосредственно в UserControl, поскольку Instance.DisplayName может использоваться непосредственно страницей aspx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...