none
Mejorar la construcción de objetos RRS feed

  • Pregunta

  • Hola, me pregunto si es posible mejorar esto ya que tengo que escribir el código dos veces al construir un objeto, veamos.

    Tengo una clase "Exterior" que crea objetos de una clase anidada "Interior", entonces tengo que escribir dos veces el hecho de tener que definir el parámetro "pValor", una en el constructor de la clase anidada y otra en el método "CreaInterior".

    Este es un ejemplo muy simplificado:

    public class Exterior {

    private class Interior { private int valor;

    public Interior( int pValor ) // primera vez { valor = pValor; } }

    public void CrearInterior( int pValor ) // segunda vez { Interior interior = new Interior( pValor ); }

    }

    Entonces ¿hay algún modo de reducir ese código?.

    Intenté espaciar el código pero no pude porque la tecla TAB no lo permite.


    • Editado Pablo_82 viernes, 19 de febrero de 2021 10:22
    viernes, 19 de febrero de 2021 10:19

Respuestas

  • Me gustaba más la versión original. Era más elegante.

    Fíjate que no lo estás "ejecutando dos veces". Aunque se parezcan mucho, las dos invocaciones tienen finalidad distinta. La primera es un constructor para la clase interna. Es correcto definir un constructor que reciba como parámetro los datos que se van a guardar en las variables privadas. No es que no puedas además exponer una propiedad pública, como se propone en el último mensaje, pero es correcto, elegante y deseable tener en la clase un constructor que funcione como en el primer ejemplo.

    Y luego está la segunda invocación, que NO ES LO MISMO. Es como cuando defines una función en un sitio y luego llamas a la función. Aunque el nombre de la función exista en ambos sitios, no da igual. Una cosa es definirla, y luego la puedes llamar desde varios sitios cuando sea necesario. Lo mismo pasa con el constructor. Se define una vez dentro de la clase, y luego lo llamas desde cualquier sitio en el que quieras construir una instancia de la clase. Eso es deseable y correcto, y no es una "repetición" a pesar de que el nombre de la clase se use en ambos sitios. Y eso es lo que estás haciendo en tu "segunda" llamada. Estás invocando al constructo para que construya una instancia. Es un código claro y correcto. Y traspasa el valor interno por mediación del constructor, que también es claro, correcto y adecuado. No creo que se deba hacer nada para abreviarlo. Lo único que conseguirías es romper la encapsulación o enrevesar la estructura de las clases.

    • Marcado como respuesta EricRRModerator martes, 23 de febrero de 2021 19:21
    • Desmarcado como respuesta EricRRModerator martes, 23 de febrero de 2021 19:21
    • Propuesto como respuesta EricRRModerator martes, 23 de febrero de 2021 19:21
    • Marcado como respuesta EricRRModerator jueves, 25 de febrero de 2021 23:33
    martes, 23 de febrero de 2021 18:11
    Moderador

Todas las respuestas

  • Hola Pablo,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    viernes, 19 de febrero de 2021 15:20
    Moderador
  • Hola, puedes dejar un constructor pro defecto vacío en la clase anidada e implementar una propiedad en la interior.

    public class Exterior
    {
      private class Interior
      {
        private int valor;
        public int Valor // propiedad
        { 
           get 
           {
             return valor;
           }
           set
           { 
             valor = value;
           }
        }
    
        public Interior() // constructor por defecto
        {
      
        }
      }
      public void CrearInterior(int pValor ) // segunda vez
      {
        Interior interior = new Interior() { Valor = pValor };
      }
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Propuesto como respuesta EricRRModerator miércoles, 24 de febrero de 2021 15:27
    viernes, 19 de febrero de 2021 16:00
    Moderador
  • Me gustaba más la versión original. Era más elegante.

    Fíjate que no lo estás "ejecutando dos veces". Aunque se parezcan mucho, las dos invocaciones tienen finalidad distinta. La primera es un constructor para la clase interna. Es correcto definir un constructor que reciba como parámetro los datos que se van a guardar en las variables privadas. No es que no puedas además exponer una propiedad pública, como se propone en el último mensaje, pero es correcto, elegante y deseable tener en la clase un constructor que funcione como en el primer ejemplo.

    Y luego está la segunda invocación, que NO ES LO MISMO. Es como cuando defines una función en un sitio y luego llamas a la función. Aunque el nombre de la función exista en ambos sitios, no da igual. Una cosa es definirla, y luego la puedes llamar desde varios sitios cuando sea necesario. Lo mismo pasa con el constructor. Se define una vez dentro de la clase, y luego lo llamas desde cualquier sitio en el que quieras construir una instancia de la clase. Eso es deseable y correcto, y no es una "repetición" a pesar de que el nombre de la clase se use en ambos sitios. Y eso es lo que estás haciendo en tu "segunda" llamada. Estás invocando al constructo para que construya una instancia. Es un código claro y correcto. Y traspasa el valor interno por mediación del constructor, que también es claro, correcto y adecuado. No creo que se deba hacer nada para abreviarlo. Lo único que conseguirías es romper la encapsulación o enrevesar la estructura de las clases.

    • Marcado como respuesta EricRRModerator martes, 23 de febrero de 2021 19:21
    • Desmarcado como respuesta EricRRModerator martes, 23 de febrero de 2021 19:21
    • Propuesto como respuesta EricRRModerator martes, 23 de febrero de 2021 19:21
    • Marcado como respuesta EricRRModerator jueves, 25 de febrero de 2021 23:33
    martes, 23 de febrero de 2021 18:11
    Moderador