¿Qué tan lejos están los métodos, las propiedades, ... de una clase base, por ejemplo? clase .net TreeNode

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Estoy trabajando en alguna aplicación, que usa un control TreeView para representar objetos de negocios. Actualmente, el enlace entre los objetos comerciales y los TreeNodes se mantiene a través de la propiedad Tag del TreeNode. No estoy muy contento con esto, porque creo que el enlace no es " apretado " suficiente. Por ejemplo, podría haber un objeto TreeNode sin un objeto comercial, también quiero actualizar la imagen TreeNode en función del estado del objeto comercial. Por lo tanto, obtuve mi propia clase especial de TreeNode de 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;
      }
   }

Con este enfoque mínimo, debo convertir cada vez que llamo a una propiedad o método de la clase base que devuelve un objeto TreeNode como en " (ActionTreeNode) myNode.Parent " ;. La solución sería anular / sobrescribir todos los métodos o propiedades y devolver un objeto de tipo ActionTreeNode. ¿Qué piensas, es más adecuado adoptar un enfoque mínimo o harías el esfuerzo de volver a implementar todos los métodos y propiedades para evitar el lanzamiento? Gracias.

¿Fue útil?

Solución

Me gusta el enfoque mínimo. Si le preocupa que su código se llene de un montón de declaraciones de conversión, simplemente cree un método para hacerlo en un solo lugar:

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
}

No olvide la comprobación nula en el valor de retorno, si el padre no es un ActionTreeNode ...

Otros consejos

Creo que la pregunta es cuánto tiempo le tomará esforzarse para que se escriba con fuerza.

Aumente el costo de hacer cada cosa " apretado " con el costo de que usted y otros desarrolladores tengan una plataforma sólida con la que trabajar.

Sin saber más, personalmente creo que lo escribiría con fuerza, ya que también significará que cualquier cambio en su lógica de negocios, como los diferentes tipos almacenados en el árbol, dará como resultado un error de compilación en lugar de posibles errores desconocidos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top