Un constructor nos sirve para crear un objeto, es un método especial el cual no regresa un valor y tiene el mismo nombre de la clase; cada que creamos un objeto utilizamos la palabra new seguido del nombre de la clase, en ese momento estamos invocando el constructor; se preguntaran como invocamos el constructor en el capitulo anterior si no lo definimos, pues, existe un constructor por defecto el cual no recibe ningún parámetro y así si no definimos constructor ya existe uno es por eso que podemos invocar un constructor sin parámetros aunque no lo hayamos definido.
Los constructores pueden ser mas de uno en la misma clase, siempre y cuando reciban distintos parámetros.
Pero la duda que sale ahora es: ¿Para que me sirve un constructor?, sencillamente para obligar que en la creación de un objeto se reciban ciertos parámetros necesarios y así evitar que nuestro objeto funcione mal, por ejemplo veamos el código del capítulo anterior donde creamos una galleta:
class Galleta { public int cantidadHarina; public int cantidadDeAgua; public int tiempoDeHorneado; public string nombreGalleta; private int tiempoHorneada; public void Hornear() { for (int i = 0; i < tiempoDeHorneado; i++) { tiempoHorneada++; } System.Console.WriteLine("Horneada la galleta"); } }
Si vemos este código, que pasaría si yo no defino el atributo tiempoDeHorneado y después invoco el método Hornear(), simplemente no tendría una funcionalidad definida ya que mi atributo no valdría nada por lo cual no se hornearía. Para ello cambiemos el código para que obliguemos al programador a enviar ese atributo, de la siguiente manera:
class Galleta { public int cantidadHarina; public int cantidadDeAgua; public int tiempoDeHorneado; public string nombreGalleta; private int tiempoHorneada; //constructor public Galleta(int tiempoDeHorneado) { this.tiempoDeHorneado = tiempoDeHorneado; } public void Hornear() { for (int i = 0; i < tiempoDeHorneado;i++ ) { tiempoHorneada++; } System.Console.WriteLine("Horneada la galleta"); } }
En este código vemos que agregue un nuevo método de nombre Galleta y el cual recibe un entero, también utilizo la palabra reservada this, esta palabra nos sirve para indicar que estamos haciendo referencia a la variable de la clase, y si vemos recibimos una variable de mismo nombre, si no utilizamos la palabra this, hacemos referencia a la que recibimos como argumento, y lo que hago es simplemente darle el valor que recibo a mi atributo de la clase Galleta, y así poder utilizarlo dentro de mis métodos.
Nota: Cuando se define un constructor, el constructor por defecto ya no existe y obligamos a utilizar solo los constructores que existen en nuestra clase (ya no podemos utilizar Galleta() sin parámetros ya que definí un constructor con parámetro).
Y a continuación les muestro la forma en cómo utilizaríamos el constructor, y es la siguiente:
class Program { static void Main(string[] args) { Galleta miGalleta = new Galleta(100); miGalleta.nombreGalleta = "chocochips"; miGalleta.cantidadDeAgua = 10; miGalleta.cantidadHarina = 10; miGalleta.Hornear(); //linea para poder ver el texto de el metodo hornear Console.ReadLine(); } }
Cuando creamos un proyecto tipo consola en Visual Studio, la clase Program se crea por defecto y esta contiene el método Main, el cual es el que se ejecuta cuando corremos el proyecto.
Recuerda que puedes definir muchos más constructores siempre y cuando tengan distintos parámetros ya sea en cantidad de estos o distinto tipo de dato. Por ejemplo podríamos crear un constructor para obligar a que el programador envié el nombre, la cantidad de harina y la cantidad de agua, y ya decida cual utilizar, y para ello nos quedaría nuestra clase Galleta de la siguiente forma:
class Galleta { public int cantidadHarina; public int cantidadDeAgua; public int tiempoDeHorneado; public string nombreGalleta; private int tiempoHorneada; //constructor public Galleta(int tiempoDeHorneado) { this.tiempoDeHorneado = tiempoDeHorneado; } //constructor 2 public Galleta(int tiempoDeHorneado,string nombreGalleta,int cantidadHarina, int cantidadDeAgua) { this.tiempoDeHorneado = tiempoDeHorneado; this.nombreGalleta = nombreGalleta; this.cantidadHarina = cantidadHarina; this.cantidadDeAgua = cantidadDeAgua; } public void Hornear() { for (int i = 0; i < tiempoDeHorneado;i++ ) { tiempoHorneada++; } System.Console.WriteLine("Horneada la galleta"); } }