Как далеко можно переопределить методы, свойства, ... базового класса, например, .net TreeNode класс - PullRequest
2 голосов
/ 05 мая 2009

Я работаю над некоторым приложением, которое использует элемент управления 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. Как вы думаете, более ли подходит минимальный подход или вы попытаетесь переопределить все методы, свойства, чтобы избежать приведения? Спасибо.

Ответы [ 2 ]

3 голосов
/ 05 мая 2009

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

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

2 голосов
/ 05 мая 2009

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

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

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

...