none
Problemas con el constructor base que heredo RRS feed

  • Pregunta

  • Buenos días

    Tengo Objeto A que hereda obligatoriamente del objeto Letra que a su vez hereda obligatoriamente del objeto Caracter

    Los constructores que tengo:

       En el objeto A

    public A (string valor, int tamaño, string tipoLetra, string caracter) : base ( tamaño,  tipoLetra, caracter)
    {
       //Configuraciones a la hora de crear el objeto.
       LeerDatos(caracter);
    }

       En el objeto Letra

             A (int tamaño, string tipoLetra, string caracter) : base (caracter)

       En el objeto Caracter

    public Caracter(string caracter)            
    {
       LeerDatos(caracter);
    }

    El problema que tengo es no puedo modificar los class Letra y Caracter. Ya que solo se me permite modificar el class A

    Cuando creo el class A antes de entrar en el cuerpo del constructor, va a: base ( tamaño,  tipoLetra, caracter)

    Mi problema radica en que como no he configurado previamente A llama a LeerDatos que está en el class Caracter antes de ser configurado y luego me veo obligado a volver a llamarlo, haciendo que cada vez que se construye el objeto A tenga que llamar al método 2 veces, una donde no me sirve para nada que es dentro del class Caracter y la otra donde sí.

    Quería configurar mi constructor para que en vez de tener

    public A (string valor, int tamaño, string tipoLetra, string caracter) : base ( tamaño,  tipoLetra, caracter)

    Fuera algo como

    public A (string valor, int tamaño, string tipoLetra, string caracter)

    Y luego dentro del objeto cuerpo del constructor A llamar al constructor 

    base ( tamaño,  tipoLetra, caracter)

    ¿Hay algún modo de no llamar al método LeerDatos() dos veces, sin tener que modificar los class Letra y Caracter? Que sea modificando el constructor de A

    Muchas gracias.

    jueves, 3 de mayo de 2018 8:05

Todas las respuestas

  • Pregunta: ¿El método LeerDatos es virtual? Si es así podrías hacerle un override para que no lea nada, y cuando luego tengas que leer datos de verdad puedes llamar a base.LeerDatos.

    Pero no se puede hacer lo que querías en el sentido de llamar al constructor base desde dentro del cuerpo del constructor de tu clase. Si no hay ninguna alternativa, y realmente necesitas esto, el remedio es NO heredar de la clase base, y en su lugar encapsular dentro de tu clase una instancia de la clase que antes era la madre. De esa manera puedes llamar al auténtico constructor y luego cambiar la información que quieras. Pero claro, no tienes herencia y por tanto tu lase no es sustituíble en el lugar de la clase que antes usabas como madre.

    La conclusión de todo esto es que el diseño de Letra y Caracter no es un buen diseño, desde el punto de vista de poder heredar de ellas sin efectos colaterales como el de LeerDato. Es una lástima que no te permitan modificarlas para corregir el mal diseño.

    jueves, 3 de mayo de 2018 13:38
    Moderador
  • Muchas gracias. Llegue a la misma conclusión de que no era un buen diseño.

    El método LeerDatos NO es virtual.


    lunes, 7 de mayo de 2018 7:17