El encadenamiento de constructores está fuertemente unido a la sobrecarga de los constructores. La sobrecarga significa crear diferentes versiones para nuestro constructor para acomodar las necesidades de diferentes situaciones. Por ejemplo, una aplicación podría tener una clase de empleado que nos permita crear nuevos empleados en nuestros sistemas. Podríamos tener diferentes constructores basados en la cantidad de información que tenemos por adelantado de los nuevos empleados.
Esta clase nos permitiría implementar de manera flexible una inicialización diferente para un nuevo empleado. Tenemos la opción de instanciar sin ningún argumento, y podemos hacerlo con uno o dos argumentos al mismo tiempo.
12345678910111213141516publicclassNewEmployee{publicstring nombre;publicstring apellido;publicNewEmployee(){ Consola.WriteLine("Reservar nuevo registro para el próximo empleado.");}publicNewEmployee(cadena nombreNombre){este.nombreNombre = nombreNombre; Consola. WriteLine("Crear un nuevo registro para el próximo empleado, con nombre!");}publicNewEmployee(string nombre,string apellido){este.apellido = apellido;this.firstName = nombre; Console.WriteLine("Crear un nuevo registro para el próximo empleado, con nombre y apellido!");}}
csharp
Este ejemplo sufre, sin embargo, de un defecto fatal. Normalmente preferimos inicializar cada atributo relacionado con el registro con una sola llamada para nuestro empleado en lugar de tratar de encontrar o elaborar los argumentos apropiados basados en los constructores para nuestra situación. ¿Cómo podríamos mejorar estos constructores con muy poca codificación? Nos encantaría tener asignado un nombre y apellido por defecto.
Entra en el encadenamiento de constructores.
La sintaxis para esto es la siguiente.
1234567publicNewEmployee():this("Nombre predeterminado", "Apellido predeterminado"){Console.WriteLine("Reservar nuevo registro para el próximo empleado.");}publicNewEmployee(string firstName):this(firstName, "Apellido predeterminado"){this.firstName = firstName; Console.WriteLine("Crear nuevo registro para el próximo empleado, con firstName!");}
csharp
La clave es la palabra clave :this(), que es una referencia a otro constructor. El orden de la llamada es el siguiente: Primero, llamamos al constructor al que se hace referencia con la palabra clave :this(), y si éste también hace referencia a otro constructor, también llamará a ese constructor, subiendo por la cadena de llamada.
Construyamos un ejemplo completo para subir a la cadena.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 usando el sistema;namespace cnstructors{publicclassNewEmployee{publicstring firstName;publicstring apellido;publicstring empID;publicstring position;publicstring team;publicNewEmployee(): this("Default firstName", "Default lastName"){ Consola. WriteLine("Reservar nuevo registro para el próximo empleado. ");}publicNewEmployee(string firstName):this(firstName, "Default lastName"){this.firstName = firstName; Console.WriteLine("Creando nuevo registro para el próximo empleado, con firstName! ");}publicNewEmployee(cadena nombre,cadena apellido):this(firstName, lastName, "XC007", "Java Developer", "The JAVA team"){this.lastName = apellido;this.firstName = nombre; Console. WriteLine("Creación de un nuevo registro para el próximo empleado, con nombre y apellido!");}publicNewEmployee(string nombre,string apellido,string empID,string posición,string equipo){this.firstName = nombre;this.lastName = apellido;this.empID = empID;this.position = posición;this.team = equipo; Console.WriteLine("Creación de un nuevo registro para el próximo empleado, con nombre, apellido, empID, posición y equipo! ");}}clase cnstrct {staticvoidMain(string[] args){ Console.WriteLine("¡Primera construcción!");NewEmployee a =newNewEmployee(); Console.WriteLine("¡Segunda construcción!") ");NewEmployee b =newNewEmployee("Daniel"); Console.WriteLine("Tercera construccion!");NewEmployee c =newNewEmployee("Daniel", "Szabo"); Console.ReadKey();;}}}}
csharp
El resultado de nuestra ejecución demuestra perfectamente cómo funciona la cadena.
1234567891011¡Primera construcción! Creando un nuevo registro para el próximo empleado, con nombre, apellido, empID, posición y equipo! Creando un nuevo registro para el próximo empleado, con nombre y apellido! Reservando un nuevo registro para el próximo empleado. Segunda construcción! Creando un nuevo registro para el próximo empleado, con nombre, apellido, empID, posición y equipo! Creando un nuevo registro para el próximo empleado, con nombre y apellido. Creando un nuevo registro para el próximo empleado, con nombre. Tercera construcción. Creando un nuevo registro para el próximo empleado, con nombre, apellido, empid, posición y equipo. Creando un nuevo registro para el próximo empleado, con nombre y apellido.
bashBásicamente, el último constructor llamado es el primero en la cadena de llamadas.