Polimorfismo
Polimorfismo
En el ámbito de POO el polimorfismo hace referencia a la habilidad que tienen objetos de diferentes clases para responder a métodos con el mismo nombre, pero con implementaciones diferentes.
En otras palabras, el polimorfismo es la capacidad que tienen los objetos de responder a un mismo mensaje de diferentes formas.
Por ejemplo, si tomamos las clases Character
, Warrior
y Wizard
que definimos en el tema anterior, podemos ver que todas ellas tienen un método attack()
, pero que cada una de ellas lo implementa de forma diferente.
Podemos instanciar objetos de estas y comprobar que el método attack()
difiere en su comportamiento dependiendo del objeto que invoque a este método.
1Character character = new Character("Character", 1, 100);2Warrior warrior = new Warrior("Warrior", 1, 100, 10);3Wizard wizard = new Wizard("Wizard", 1, 100, 20);4
5character.attack();6warrior.attack();7wizard.attack();
Esto es a lo que hace alusión el polimorfismo, muchas formas de responder a un mismo mensaje.
Esta es una característica muy común en clases que implementan la herencia, pero no es exclusiva de estas. Podrían existir clases que tengán métodos con el mismo nombre, pero que no tengan ninguna relación entre ellas.
Por otro lado, si una clase cuenta con métodos sobrecargados, también podríamos decir que esta clase cuenta con polimorfismo. Para ver un ejemplo, más claro de esto, supongamos que la clase Warrior
puede atacar de dos maneras distintas, una de ellas de la manera que definimos previamente, y otra en la que recibe un parámetro de tipo int
, que representa fuerza adicional que se aplicará al ataque.
1class Warrior extends Character {2 private int strength;3
4 public Warrior(String name, int level, int health, int strength) {5 super(name, level, health);6 this.strength = strength;7 }8
9 public int getStrength() {10 return strength;11 }12
13 @Override14 public void attack() {15 System.out.println("Atacando...");16 System.out.println("Daño: " + (10 + strength));17 }18
19 public void attack(int strength) {20 System.out.println("Atacando...");21 System.out.println("Daño: " + (10 + this.strength + strength));22 }23}
En esta ocasión, podremos ver que el método attack()
también tiene comportamiento polimórfico dentro de la clase Warrior
, sin tener en cuenta otras clases.
1Warrior warrior = new Warrior("Warrior", 1, 100, 10);2
3warrior.attack();4warrior.attack(10);
Esto nos indica, que un mismo objeto puede responder de diferentes maneras a un mismo mensaje. Como vemos, al indicar cierta información adicional en el mensaje que se le envía al objeto (en este caso, el parámetro strength
).