Foxpro
Polimorfismo
Introducción
Polimorfismo es la capacidad de que diferentes objetos de una misma jerarquía tengan comportamientos1 distintos aunque reciban el mismo mensaje2. La idea detrás del polimorfismo es poder diseñarnuestro código teniendo en cuenta que todos las clases que derivan de una clase base heredan los métodos de la clase base. Consideremos el siguiente ejemplo3, que define una clase abstracta Animal. Animal tiene un método habla() que es reemplazado (override) en las subclases Perro y Gato.
abstract public class Animal { private String nombre; public Animal(String nombre) { this.nombre = nombre; }public String getNombre() { return nombre; } abstract public void habla(); } public class Perro extends Animal { public Perro(String nombre) { super(nombre); } public void habla() { System.out.println(getNombre()+": Warf, Guau, etc."); } } public class Gato extends Animal { public Gato(String nombre) { super(nombre); } public void habla() { System.out.println(getNombre()+": Miau, Pffff, etc."); } }public class TestAnimal { public static void main(String[] args) { // un array de Animal Animal[] animales = { new Perro("Kujo"), new Perro("Fido"), 1 Traducción propia. Definición original: “Polymorphism is the ability of different objects in a class hierarchy to exhibit unique behavior in response to the same message” (Standard C++ Bible. AL STEVENS, CLAYTON WALNUM. IDG Books, 2000, p. 440) 2Recordar que enviar el mensaje play() a un objeto test quiere decir llamar al método play() del objeto test. Es decir, test.play(); 3 Si no se entiende por qué en Gato y Perro tenemos que definir constructores que llamen al constructor de la superclase, será bueno repasar el capítulo de herencia.
–1–
}
}; for( Animal a : animales) a.habla(); } // end main // end class
newGato("Garfield"), new Gato("Patán")
La salida:
Kujo: Warf, Guau, etc. Fido: Warf, Guau, etc. Garfield: Miau, Pffff, etc. Patán: Miau, Pffff, etc.
El método main de la clase TestAnimal crea varios objetos Perro y Gato, y los guarda en un arreglo4. Luego el for itera los elementos del arreglo, y llama al método habla() de cada elemento. En este caso, el for se ha diseñado teniendo en cuenta solamente quela clase base tiene un método abstracto habla() y que, por tanto, todas las clases que deriven de ella tendrán un método habla(). TestAnimal funciona con Perro y Gato, pero también funciona con cualquier objeto que derive de Animal. Cuando decimos a.habla(), estamos enviando el mismo mensaje a objetos distintos de la misma jeraquía de clases (Perro, Gato: depende de que objeto sea a en esaiteración), y cada objeto manifiesta su comportamiento de modo distinto (ladrando o mauyando, siguiendo la analogía).
Upcasting
Cuando estudiamos herencia, vimos cómo un objeto puede usarse como objeto de su propio tipo o como un objeto del tipo de su clase base. Esto se llama upcasting. Upcasting es tomar la referencia a un objeto y usarla como una referencia de su clase base. Se llama así porquenormalmente se dibujan los árboles de objetos con la clase base arriba. Animal
Perro
Gato
Siguiendo el ejemplo anterior, cuando decimos Animal a = new Perro(“Fido”); estamos haciendo un upcast, pues estamos usando un objeto Perro como si fuera del tipo de su clase base.
4 Puedo almacenar objetos Perro y Gato en un arreglo de Animal porque Perro y Gato son del tipo de su subclase, Animal.–2–
Binding5
Late binding
Para estar seguros de que estamos entendiendo cómo funciona el polimorfismo, volvamos a considerar este pedazo de código del ejemplo anterior. La línea a.habla(), ¿a qué método habla() llama? ¿Al de Perro, al de Gato o al de Animal?
Animal[] animales = { new Perro("Kujo"), new Perro("Fido"), new Gato("Garfield"), new Gato("Patán") }; for( Animal a : animales)...
Regístrate para leer el documento completo.