Saltearse al contenido

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.

1
Character character = new Character("Character", 1, 100);
2
Warrior warrior = new Warrior("Warrior", 1, 100, 10);
3
Wizard wizard = new Wizard("Wizard", 1, 100, 20);
4
5
character.attack();
6
warrior.attack();
7
wizard.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.

1
class 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
@Override
14
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.

1
Warrior warrior = new Warrior("Warrior", 1, 100, 10);
2
3
warrior.attack();
4
warrior.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).