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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
);
}
}
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 ); } }
    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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class Casa : Inmueble
{
//Estados - Atributos
//...
//Comportamientos - Métodos
//...
//Constructor
public Casa(string tipo, double prec)
{
this.tipoInmueble = tipo;
this.precio = prec;
}
}
public class Casa : Inmueble { //Estados - Atributos //... //Comportamientos - Métodos //... //Constructor public Casa(string tipo, double prec) { this.tipoInmueble = tipo; this.precio = prec; } }
public class Casa : Inmueble
{
    //Estados - Atributos
    //...
    //Comportamientos - Métodos
    //...
    //Constructor
    public Casa(string tipo, double prec)
    {
        this.tipoInmueble = tipo;
        this.precio = prec;
    }
}

Clase Departamento

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class Departamento:Inmueble
{
//Estados - Atributos
//...
//Comportamientos - Métodos
//...
//Constructor
public Departamento(string tipo, double prec)
{
this.tipoInmueble = tipo;
this.precio = prec;
}
}
public class Departamento:Inmueble { //Estados - Atributos //... //Comportamientos - Métodos //... //Constructor public Departamento(string tipo, double prec) { this.tipoInmueble = tipo; this.precio = prec; } }
    public class Departamento:Inmueble
    {
        //Estados - Atributos
        //...
        //Comportamientos - Métodos 
        //... 
        //Constructor
        public Departamento(string tipo, double prec)
        {
            this.tipoInmueble = tipo;
            this.precio = prec;
        }
    }

Clase Terreno

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
public class Departamento:Inmueble
{
//Estados - Atributos
//...
//Comportamientos - Métodos
//...
//Constructor
public Departamento(string tipo, double prec)
{
this.tipoInmueble = tipo;
this.precio = prec;
}
}
public class Departamento:Inmueble { //Estados - Atributos //... //Comportamientos - Métodos //... //Constructor public Departamento(string tipo, double prec) { this.tipoInmueble = tipo; this.precio = prec; } }
    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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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();
}
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(); }
    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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Terreno VENDIDA por el precio de 9545555
Departamento duplex VENDIDA por el precio de 95454
Casa de campo VENDIDA por el precio de 59954
Terreno VENDIDA por el precio de 9545555 Departamento duplex VENDIDA por el precio de 95454 Casa de campo VENDIDA por el precio de 59954
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
);
}
}
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 ); } }
    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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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();
}
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(); }
    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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
);
}
}
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 ); } }
    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.