Programación Orientada a Objetos – Herencia (POO Parte 4)

El pilar de la herencia en programación orientada a objetos, es lo mismo que la herencia en la vida real, cuando un padre hereda bienes a sus hijos, pero en este caso nos referimos a pasar atributos y métodos desde una clase padre (Súper Clase) hacia las clases hija (Clases Derivadas), por medio del cual la clase se deriva de otra clase. De manera que extiende su funcionalidad. Ello destaca por alcanzar los objetivos más preciados en el desarrollo de software que son; la reutilización y la extensibilidad.

La herencia facilita la creación de objetos a partir de otros objetos o clases ya existentes, de esta manera permite que una subclase obtenga todos los comportamientos y atributos de la superclase o clase padre, para entender mejor la importancia de herencia veamos el siguiente ejemplo.

Supongamos que tenemos tres clases (Casa, Departamento, Terreno) en nuestra aplicación de agencia inmobiliaria, con sus respectivos atributos y métodos.

Clase Casa

    public class Casa
    {
        //Estados - Atributos
        public string ubicacion;
        public double areaConstruida;
        public double areaTerreno;
        public int cantDormitorios;
        public int cantPisos;
        public int cantBaños;
        public double precio;

        //Comportamientos - Métodos
        public void vender()
        {
            Console.WriteLine(tipo + " VENDIDA\nMas detalles:");
            Console.WriteLine("\tUbicación: " + ubicacion);
        }

        public void alquilar()
        {
            Console.WriteLine(tipo + " puesto en ALQUILER\nMas detalles:");
            Console.WriteLine("\tUbicación: " + ubicacion);
        }
    }

Clase Departamento

    public class Departamento
    {
        //Estados - Atributos
        public string tipo;
        public string ubicacion;
        public double areaConstruida;
        public int cantDormitorios;
        public int cantBaños;
        public double precio;

        //Comportamientos - Métodos
        public void vender()
        {
            Console.WriteLine(tipo + " VENDIDA\nMas detalles:");
            Console.WriteLine("\tUbicación: " + ubicacion);
        }

        public void alquilar()
        {
            Console.WriteLine(tipo + " puesto en ALQUILER\nMas detalles:");
            Console.WriteLine("\tUbicación: " + ubicacion);
        }
    }

Clase Terreno

    public class Terreno
    {
        //Estados - Atributos
        public string ubicacion;
        public double areaTerreno;
        public double precio;

        //Comportamientos - Métodos
        public void vender()
        {
            Console.WriteLine(tipo + " VENDIDA\nMas detalles:");
            Console.WriteLine("\tUbicación: " + ubicacion);
        }

        public void alquilar()
        {
            Console.WriteLine(tipo + " puesto en ALQUILER\nMas detalles:");
            Console.WriteLine("\tUbicación: " + ubicacion);
        }
    }

Si se darán cuenta, estas clases/objetos comparten características comunes, es decir, tanto la clase casa, departamento, terreno y proyecto, tienen algunos atributos y métodos iguales. Por lo tanto, aquí se está generando duplicidad de código que va en contra de los principios de la programación orientada a objetos. Y el pilar de la herencia soluciona este problema,  permitiendo la reutilización de código y extensibilidad de funciones.

Ejemplo C#

Entonces para solventar el problema y dar uso la herencia, agreguemos una clase padre para estas tres clases, por ejemplo clase inmueble. Esta superclase tendrá todos los atributos y métodos comunes de estas cuatro clases. Obviamente estos atributos y métodos deben ser diferentes al modificador de acceso privado, para el caso de herencia, deberían tener los atributos y métodos protegidos o públicos según criterio, como se explicó en el pilar de la encapsulación, para este caso, en la súper clase Inmueble especifiqué que todos los atributos y métodos son públicos.

Clase Inmueble

    public class Inmueble
    {
        //Estados - Atributos
        public string tipoInmueble;
        public string ubicacion;
        public double areaTerreno;
        public int cantBaños;
        public double precio;

        //Comportamientos - Métodos
        public void vender()
        {
            Console.WriteLine(tipoInmueble+ " VENDIDA por el precio de "+precio +"\nMas detalles:");
            Console.WriteLine("\tUbicación: " + ubicacion);
        }

        public void alquilar()
        {
            Console.WriteLine(tipoInmueble + " puesto en ALQUILERpor el precio de " + precio + "\nMas detalles:");
            Console.WriteLine("\tUbicación: " + ubicacion);
        }

    }

Ahora, la clase terreno, casa, departamento y proyecto deben de heredar los atributos y métodos de la clase inmueble (Públicos y protegidos), también declararemos los atributos y métodos propios de cada clase.

En C#, la herencia se aplica mediante dos puntos ( : ), en Java Extends, en Visual Basic Inherits.

Clase Departamento

    public class Departamento:Inmueble
    {
        //Estados - Atributos Propios
        public double areaConstruida;
        public int cantDormitorios;

        //Comportamientos - Métodos Propios 
        public void mostrarDatos()
        {
            Console.WriteLine("Detalles de Inmueble");
            Console.WriteLine("\tTipo de Inmueble: " + tipoInmueble);
            Console.WriteLine("\tDireccion: " + ubicacion);      
            Console.WriteLine("\tArea construida: " + areaConstruida);
            Console.WriteLine("\tArea de terreno: " + areaTerreno);
            Console.WriteLine("\tCantidad de dormitorios: " + cantDormitorios);
            Console.WriteLine("\tCantidad de baños: " + cantBaños);
            Console.WriteLine("\tPrecio: "+precio);
        }
    }

Clase Casa

public class Casa : Inmueble
{
    //Estados - Atributos Propios
    public double areaConstruida;
    public int cantDormitorios;
    public int cantPisos;

    //Comportamientos - Métodos Propios
        public void mostrarDatos()
        {
            Console.WriteLine("Detalles de Inmueble");
            Console.WriteLine("\tTipo de Inmueble: " + tipoInmueble);
            Console.WriteLine("\tDireccion: " + ubicacion);
            Console.WriteLine("\tArea construida: " + areaConstruida);
            Console.WriteLine("\tArea de terreno: " + areaTerreno);
            Console.WriteLine("\tCantidad de dormitorios: " + cantDormitorios);
            Console.WriteLine("\tCantidad de pisos: " + cantPisos);
            Console.WriteLine("\tCantidad de baños: " + cantBaños);
            Console.WriteLine("\tPrecio: " + precio);
        }
}

Clase Terreno

    public class Terreno : Inmueble
    {
        //Estados - Atributos 
        //Comportamientos - Métodos
        public void mostrarDatos()
        {
            Console.WriteLine("Detalles de Inmueble");
            Console.WriteLine("\tTipo de Inmueble: " + tipoInmueble);
            Console.WriteLine("\tDireccion: " + ubicacion);
            Console.WriteLine("\tArea de terreno: " + areaTerreno);
            Console.WriteLine("\tCantidad de baños: " + cantBaños);
            Console.WriteLine("\tPrecio: " + precio);
        }
 
    }

Bien, como notéis, ahora podemos usar los atributos y métodos de la clase padre inmueble desde la clase terreno, casa o departamento, o podemos usar desde la clase donde instanciamos estas clases (Debido a que son atributos y métodos públicos). Ejemplo:

Clase Principal

static void Main(string[] args)
    {
            Casa casa = new Casa();
            casa.tipoInmueble = "Casa de campo";
            casa.ubicacion = "Distrito 9";
            casa.areaTerreno = 250;
            casa.areaConstruida = 350;
            casa.cantDormitorios = 12;
            casa.cantPisos = 2;
            casa.cantBaños = 8;
            casa.precio = 98756455;
            casa.vender();
            casa.mostrarDatos();

            Departamento  departamento = new Departamento();
            departamento.tipoInmueble = "Departamento duplex";
            departamento.ubicacion = "Av Argentina";
            departamento.areaConstruida = 120;
            departamento.cantDormitorios = 4;           
            departamento.cantBaños = 2;
            departamento.precio = 3020;
            departamento.alquilar();
            departamento.mostrarDatos();

            Terreno terreno = new Terreno();
            terreno.tipoInmueble = "Terreno";
            terreno.ubicacion = "Av Ugarte";
            terreno.precio = 250000;
            terreno.vender();
            terreno.mostrarDatos();

        Console.ReadKey();
    }

Descargas