Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


6.6. Constructores y destructores

Hemos visto que al declarar una clase, automáticamente se dan valores por defecto para los atributos. Por ejemplo, para un número entero, se le da el valor 0. Pero puede ocurrir que nosotros deseemos dar valores iniciales que no sean cero. Esto se puede conseguir declarando un "constructor" para la clase.

Un constructor es una función especial, que se pone en marcha cuando se crea un objeto de una clase, y se suele usar para dar esos valores iniciales, para leer información desde fichero, para reservar memoria si fuera necesario, etc.

Un constructor se declara usando el mismo nombre que el de la clase, y sin ningún tipo de retorno. Por ejemplo, un "constructor" para la clase Puerta que le diera los valores iniciales de 100 para el ancho, 200 para el alto, etc., podría ser así:

public Puerta() 
{
    ancho = 100;
    alto = 200;
    color = 0xFFFFFF;
    abierta = false;
}

Podemos tener más de un constructor, cada uno con distintos parámetros. Por ejemplo, puede haber otro constructor que nos permita indicar el ancho y el alto:

public Puerta(int an, int al) 
{
    ancho = an;
    alto = al;
    color = 0xFFFFFF;
    abierta = false;
}

Ahora, si declaramos un objeto de la clase puerta con "Puerta p = new Puerta();" tendrá de ancho 100 y de alto 200, mientras que si lo declaramos con "Puerta p2 = new Puerta(90,220);" tendrá 90 como ancho y 220 como alto.

Un programa de ejemplo que usara estos dos constructores para crear dos puertas con características iniciales distintas podría ser:

// Ejemplo_06_06a.cs
// Constructores
// Introducción a C#, por Nacho Cabanes

using System;


public class Ejemplo_06_06a
{
  
    public static void Main()
    {
        Puerta p = new Puerta();
        Puerta p2 = new Puerta(90,220);

        Console.WriteLine("Valores iniciales...");
        p.MostrarEstado();

        Console.WriteLine();
        Console.WriteLine("Vamos a abrir...");
        p.Abrir();
        p.MostrarEstado();

        Console.WriteLine();
        Console.WriteLine("Para la segunda puerta...");
        p2.MostrarEstado();
    }
  
}

// ------------------------------------------

public class Puerta
{

    protected int ancho;     // Ancho en centimetros
    protected int alto;      // Alto en centimetros
    protected int color;     // Color en formato RGB
    protected bool abierta;  // Abierta o cerrada

    public Puerta() 
    {
        ancho = 100;
        alto = 200;
        color = 0xFFFFFF;
        abierta = false;
    }

    public Puerta(int an, int al) 
    {
        ancho = an;
        alto = al;
        color = 0xFFFFFF;
        abierta = false;
    }

    public void Abrir() 
    {
        abierta = true;
    }

    public void Cerrar() 
    {
        abierta = false;
    }

    public void MostrarEstado() 
    {
        Console.WriteLine("Ancho: {0}", ancho);
        Console.WriteLine("Alto: {0}", alto);
        Console.WriteLine("Color: {0}", color);
        Console.WriteLine("Abierta: {0}", abierta);
    }
    
} // Final de la clase Puerta   

Nota: al igual que existen los "constructores", también podemos crear un "destructor" para una clase, que se encargue de liberar la memoria que pudiéramos haber reservado en nuestra clase (no es nuestro caso, porque aún no sabemos manejar memoria dinámica) o para cerrar ficheros abiertos (que tampoco sabemos). Nuestros programas son tan sencillos que todavía no los necesitarán.

Un destructor se creará con el mismo nombre que la clase y que el constructor, pero precedido por el símbolo "~", y no tiene tipo de retorno, ni parámetros, ni especificador de acceso ("public" ni ningún otro), como ocurre en este ejemplo:

~Puerta() 
{
    // Liberar memoria
    // Cerrar ficheros
}

Ejercicios propuestos:

Ejercicio propuesto 6.6.1: Ampliar las clases del ejercicio 6.5.2, para que todas ellas contengan constructores. Los constructores de casi todas las clases estarán vacíos, excepto del de PersonaInglesa, que prefijará su nombre a "John". Crea también un constructor alternativo para esta clase que permita escoger cualquier otro nombre.
Ejercicio propuesto 6.6.2: Amplía el proyecto del ejercicio 6.5.3 (Libro): la clase Libro tendrá un constructor que permita dar valores al autor, el título y la ubicación.
Ejercicio propuesto 6.6.3: Amplía el esqueleto del ConsoleInvaders (ejercicio 6.5.4): La clase Enemigo tendrá un constructor, sin parámetros, que prefijará su posición inicial. El constructor de la clase Nave recibirá como parámetros las coordenadas X e Y iniciales, para que se puedan cambiar desde el cuerpo del programa. Elimina las variables xNave e yNave de la clase Partida, que ya no serán necesarias.
Ejercicio propuesto 6.6.4: Mejora el proyecto de la clase Coche (ejercicio 6.5.5): añade un atributo "cantidadDeRuedas" a la clase Vehiculo, junto con sus Get y Set. El constructor de la clase Coche le dará el valor 4 y el constructor de la clase Moto le dará el valor 2.