Saltar al contenido

Programación Orientada a Objetos – Polimorfismo (POO Parte 5)

El pilar del polimorfismo se trata simplemente de que un único objeto puede tener múltiples estados y comportamientos, básicamente es la capacidad de los objetos de una clase, en responder de diferentes maneras a un solo mensaje, está estrechamente relacionada a la herencia, ya que mayormente sucede gracias a este.

Para entender mejor realizaré un pequeño ejemplo:

Ejemplo Polimorfismo mediante Herencia – C#

Tenemos la superclase o clase padre Inmueble, con sus respectivos atributos y el método VENDER.

Clase Inmueble

    public class Inmueble
    {
        //Estados - Atributos
        protected string tipoInmueble;
        protected string ubicacion;
        protected double areaTerreno;
        protected double precio;

        //Comportamientos - Métodos
        public void vender()
        {
            Console.WriteLine(
                tipoInmueble + " VENDIDA por el precio de " + precio
                );
        }
    }

La clase casa, departamento y terreno derivan (Heredan) de la clase Inmueble, por lo tanto, estas clases pueden usar los atributos y métodos protegidos o públicos de la clase Inmueble.

Clase Casa

public class Casa : Inmueble
{
    //Estados - Atributos
    //...
    //Comportamientos - Métodos
    //...
    //Constructor
    public Casa(string tipo, double prec)
    {
        this.tipoInmueble = tipo;
        this.precio = prec;
    }
}

Clase Departamento

    public class Departamento:Inmueble
    {
        //Estados - Atributos
        //...
        //Comportamientos - Métodos 
        //... 
        //Constructor
        public Departamento(string tipo, double prec)
        {
            this.tipoInmueble = tipo;
            this.precio = prec;
        }
    }

Clase Terreno

    public class Departamento:Inmueble
    {
        //Estados - Atributos
        //...
        //Comportamientos - Métodos 
        //... 
        //Constructor
        public Departamento(string tipo, double prec)
        {
            this.tipoInmueble = tipo;
            this.precio = prec;
        }
    }

Entonces, los objetos creados a partir de la clase casa, departamento y terreno pueden ejecutar un único método (Vender) de la clase inmueble, y este responde de diferentes maneras.

    static void Main(string[] args)
    {
        Casa casa = new Casa("Casa de campo", 59954);
        Departamento departamento = new Departamento("Departamento duplex", 95454);
        Terreno terreno = new Terreno("Terreno", 9545555);

        terreno.vender();
        departamento.vender();
        casa.vender();

        Console.ReadKey();
    }

Resultado:

Terreno VENDIDA por el precio de 9545555
Departamento duplex VENDIDA por el precio de 95454
Casa de campo VENDIDA por el precio de 59954

Como resultado tenemos que, tal tipo de casa, departamento y terreno fueron vendidos por tal precio. Sabemos que la clase casa, departamento y terreno heredan de la clase inmueble, que tiene el método VENDER, lo cual invocamos desde tres objetos diferentes, es decir se llama un mismo método, pero respondió de tres maneras diferentes. Eso es el polimorfismo más básico, y sin darnos cuenta, lo hemos estado usando en los ejercicios anteriores.

Ejemplo Polimorfismo mediante Listas Genéricas – C#

Bueno realicemos otro ejemplo interesante, tenemos la clase casa, con sus respectivos atributos, constructores y métodos.

    public class Casa
    {
        //Estados - Atributos
        public string tipo;
        public double precio;

        //Constructor
        public Casa(string tipo, double precio)
        {
            this.tipo = tipo;
            this.precio = precio;
        }
        //Comportamientos - Métodos
        public void vender()
        {
            Console.WriteLine(
                tipo + " VENDIDA por el precio de " + precio
                );
        }
    }

Ahora crearemos una cantidad de objetos a partir de la clase casa, agregaremos a una lista (único objeto de tipo lista), ejecutaremos una sola acción y éste responderá de muchas maneras.

    static void Main(string[] args)
    {
        Casa casa1 = new Casa("Casa de campo", 59954);
        Casa casa2 = new Casa("Casa rural", 324324);
        Casa casa3 = new Casa("Casa de playa", 57676);
        Casa casa4 = new Casa("Casa unifamiliar", 123567);
        Casa casa5 = new Casa("Casa prefabricada", 9787);
        Casa casa6 = new Casa("Casa proyecto", 3345454);

        List<Casa> casas = new List<Casa>();
        casas.Add(casa1);
        casas.Add(casa2);
        casas.Add(casa3);
        casas.Add(casa4);
        casas.Add(casa5);
        casas.Add(casa6);

        foreach (Casa item in casas)
        {
            item.vender();
        }

        Console.ReadKey();
    }

Resultado:

Casa de campo VENDIDA por el precio de 59954
Casa rural VENDIDA por el precio de 324324
Casa de playa VENDIDA por el precio de 57676
Casa unifamiliar VENDIDA por el precio de 123567
Casa prefabricada VENDIDA por el precio de 9787
Casa proyecto VENDIDA por el precio de 3345454

Ejemplo Polimorfismo mediante Sobrecarga

Algunos también consideran polimorfismo a la sobrecarga de métodos o constructores, que básicamente es que un método o constructor se puede declarar varias veces con el mismo nombre, pero con diferentes parámetros, ya sea por cantidad de parámetros o tipo de dato.

    public class Casa
    {
        //Estados - Atributos
        public string tipo;
        public double precio;
        public double areaTerreno;
        public double areaConstruida;

        //Constructor
        public Casa()
        {

        }
        public Casa(string tipo, double precio)
        {
            this.tipo = tipo;
            this.precio = precio;
        }

        public Casa(string tipo, double precio, double areaTerreno, double areaConstruida)
        {
            this.tipo = tipo;
            this.precio = precio;
            this.areaTerreno = areaTerreno;
            this.areaConstruida = areaConstruida;
        }

        //Comportamientos - Métodos
        public void vender()
        {
            Console.WriteLine(
                tipo + " VENDIDA por el precio de " + precio
                );
        }

        public void vender(string cliente)
        {
            Console.WriteLine(
                tipo + " VENDIDA por el precio de " + precio+" por cliente: "+ cliente
                );
        }

        public void vender(double descuento)
        {
            Console.WriteLine(
                tipo + " VENDIDA por el precio de " + precio+ "con descuento: "+ descuento
                );
        }

    }

Los comentarios están cerrados.