Как далеко зайти переопределяющие методы, свойства & # 8230; базового класса, например .net TreeNode класс

StackOverflow https://stackoverflow.com/questions/824128

  •  05-07-2019
  •  | 
  •  

Вопрос

Я работаю над некоторым приложением, которое использует элемент управления TreeView для представления бизнес-объектов. В настоящее время связь между бизнес-объектами и TreeNodes поддерживается через свойство Tag TreeNode. Я не очень доволен этим, потому что я думаю, что ссылка не является "жесткой" довольно. Например, может существовать объект TreeNode без бизнес-объекта, также я хочу обновить изображение TreeNode в зависимости от состояния бизнес-объекта. Поэтому я получил свой собственный специальный класс TreeNode из TreeNode:

class ActionTreeNode : TreeNode
   {
      private Action mAction;

      public Action Action
      { get ... }

      public ActionTreeNode(Action action)
         : base()
      {
         if (action == null) throw new ArgumentNullException("action", "Paramter action must not be null.");

         mAction = action;
      }

    public void UpdateState()
      {
         switch (mAction.ActionState)
         {
            case ActionState.Passed:
               SelectedImageIndex = 3;
               ImageIndex = 3;
               break;
            case ActionState.Failed:
               SelectedImageIndex = 2;
               ImageIndex = 2;
               break;
            ...
         }

         return;
      }
   }

При таком минимальном подходе мне приходится каждый раз вызывать свойство или метод базового класса, который возвращает объект TreeNode, как в " (ActionTreeNode) myNode.Parent " ;. Решением было бы переопределить / перезаписать каждый метод или свойство и вернуть объект типа ActionTreeNode. Как вы думаете, более ли подходит минимальный подход или вы попытаетесь переопределить все методы, свойства, чтобы избежать приведения? Спасибо.

Это было полезно?

Решение

Мне нравится минимальный подход. Если вас беспокоит загромождение вашего кода множеством операторов приведения, просто создайте метод, который сделает это за вас в одном месте:

private ActionTreeNode GetParent(ActionTreeNode node)
{
    return node.Parent as ActionTreeNode;
}

// in some method:
ActionTreeNode parent = GetParent(someNode);
if (parent != null)
{
    // the parent is an ActionTreeNode
}

Не забудьте проверить нулевое значение возвращаемого значения, если родитель не является ActionTreeNode ...

Другие советы

Думаю, вопрос в том, сколько времени вам понадобится, чтобы сделать его строго типизированным.

Взвесьте стоимость изготовления каждого "трудного" решения. со стоимостью вас и других разработчиков, имеющих надежную платформу для работы.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top