CodeGym /Blog Java /Random-ES /Polimorfismo en Java
Autor
Milan Vucic
Programming Tutor at Codementor.io

Polimorfismo en Java

Publicado en el grupo Random-ES
¡Hola! Hoy concluimos una serie de lecciones sobre los principios de la programación orientada a objetos. En esta lección, hablaremos sobre el polimorfismo de Java. El polimorfismo es la capacidad de trabajar con varios tipos como si fueran del mismo tipo. Además, el comportamiento de los objetos será diferente dependiendo de su tipo. Echemos un vistazo más de cerca a esta declaración. Empecemos por la primera parte: 'la capacidad de trabajar con varios tipos como si fueran del mismo tipo'. ¿Cómo pueden los diferentes tipos ser iguales? Suena un poco extraño :/ Cómo usar el polimorfismo - 1De hecho, todo es muy simple. Por ejemplo, esta situación se presenta durante el uso ordinario de la herencia. Veamos cómo funciona eso. Supongamos que tenemos una clase principal Cat simple con un único método run() :

public class Cat {

   public void run() {
       System.out.println("Run!");
   }
}
Ahora crearemos tres clases que heredan Cat : Lion , Tiger y Cheetah .

public class Lion extends Cat {

   @Override
   public void run() {
       System.out.println("Lion runs at 80 km/h");
   }
}

public class Tiger extends Cat {

   @Override
   public void run() {
       System.out.println("Tiger runs at 60 km/h");
   }
}

public class Cheetah extends Cat {

   @Override
   public void run() {
       System.out.println("Cheetah runs at up to 120 km/h");
   }
}
Así que tenemos 3 clases. Modelemos la situación en la que podemos trabajar con ellos como si fueran la misma clase. Imagina que uno de nuestros gatos está enfermo y necesita la ayuda del Dr. Dolittle. Intentemos crear una clase de Dolittle que pueda curar leones, tigres y guepardos.

public class Dolittle {

   public void healLion(Lion lion) {

       System.out.println("Lion is healthy!");
   }

   public void healTiger(Tiger tiger) {

       System.out.println("Tiger is healthy!");
   }

   public void healCheetah(Cheetah cheetah) {

       System.out.println("Cheetah is healthy!");
   }
}
Parece que el problema está resuelto: la clase está escrita y lista para funcionar. Pero, ¿qué haremos si queremos extender nuestro programa? Actualmente solo tenemos 3 tipos: leones, tigres y guepardos. Pero hay más de 40 tipos de gatos en el mundo. Imagínese lo que sucedería si agregáramos clases separadas para manuls, jaguares, Maine Coons, gatos domésticos y todo lo demás. Cómo usar el polimorfismo - 2El programa en sí, por supuesto, funcionará, pero tenemos que agregar constantemente nuevos métodos a la clase Dolittle para curar a cada tipo de gato. Como resultado, crecerá a tamaños sin precedentes. Aquí es donde entra el polimorfismo, "la capacidad de trabajar con varios tipos como si fueran del mismo tipo". No necesitamos crear innumerables métodos para hacer lo mismo: curar a un gato. Un método es suficiente para todos ellos:

public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
   }
}
El método healCat() puede aceptar objetos Lion , Tiger y Cheetah ; todos son instancias de Cat :

public class Main {

   public static void main(String[] args) {

       Dolittle dolittle = new Dolittle();

       Lion simba = new Lion();
       Tiger shereKhan = new Tiger();
       Cheetah chester = new Cheetah();

       dolittle.healCat(simba);
       dolittle.healCat(shereKhan);
       dolittle.healCat(chester);
   }
}
Salida de la consola: ¡El paciente está sano! ¡El paciente está sano! ¡El paciente está sano! Entonces nuestro Dolittleclass trabaja con diferentes tipos como si fueran del mismo tipo. Ahora vamos a abordar la segunda parte: "además, el comportamiento de los objetos será diferente dependiendo de su tipo". Es todo muy simple. En la naturaleza, cada gato corre de forma diferente. Como mínimo, funcionan a diferentes velocidades. Entre nuestros tres felinos, el guepardo es el más rápido, mientras que el tigre y el león corren más lento. En otras palabras, su comportamiento es diferente. El polimorfismo hace más que simplemente permitirnos usar diferentes tipos como uno solo. También nos permite recordar sus diferencias, conservando el comportamiento propio de cada uno de ellos. El siguiente ejemplo lo ilustra. Supongamos que nuestros gatos, tras una recuperación exitosa, deciden disfrutar de una pequeña carrera. Agregaremos esto a nuestra clase Dolittle :

public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
       cat.run();
   }
}
Intentemos ejecutar el mismo código para tratar tres animales:

public static void main(String[] args) {

   Dolittle dolittle = new Dolittle();

   Lion simba = new Lion();
   Tiger shereKhan = new Tiger();
   Cheetah chester = new Cheetah();

   dolittle.healCat(simba);
   dolittle.healCat(shereKhan);
   dolittle.healCat(chester);
}
Y así es como se ven los resultados: ¡ El paciente está sano! León corre a 80 km/h. ¡El paciente está sano! Tigre corre a 60 km/h. ¡El paciente está sano! El guepardo corre a una velocidad de hasta 120 km/h Aquí vemos claramente que el comportamiento específico de los objetos se conserva, aunque pasamos los tres animales al método después de 'generalizarlos' a Gato . Debido al polimorfismo, Java recuerda bien que estos no son simplemente tres gatos. Son un león, un tigre y un guepardo, cada uno de los cuales corre de manera diferente. Esto ilustra la principal ventaja del polimorfismo: la flexibilidad. Cuando necesitamos implementar alguna funcionalidad compartida por muchos tipos, los leones, tigres y guepardos simplemente se convierten en 'gatos'. Todos los animales son diferentes, pero en algunas situaciones un gato es un gato, independientemente de su especie :) Aquí hay un video de confirmación para ti.
Cuando esta 'generalización' no es deseada y, en cambio, necesitamos que cada especie se comporte de manera diferente, cada tipo hace lo suyo. Gracias al polimorfismo, puede crear una sola interfaz (conjunto de métodos) para una amplia gama de clases. Esto hace que los programas sean menos complicados. Incluso si expandimos el programa para admitir 40 tipos de gatos, aún tendríamos la interfaz más simple: un único método run() para los 40 gatos.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION