La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Prof. Manuel B. Sánchez.  El origen del término polimorfismo es simple: proviene de las palabras griegas poly (muchos) y morphos (forma) multiforme.

Presentaciones similares


Presentación del tema: "Prof. Manuel B. Sánchez.  El origen del término polimorfismo es simple: proviene de las palabras griegas poly (muchos) y morphos (forma) multiforme."— Transcripción de la presentación:

1 Prof. Manuel B. Sánchez

2  El origen del término polimorfismo es simple: proviene de las palabras griegas poly (muchos) y morphos (forma) multiforme.  El polimorfismo describe la capacidad que tienen los objetos de comportarse de diferentes maneras dependiendo de situaciones que se presenten al momento de la ejecución.

3 En muchos lenguajes orientados a objetos el polimorfismo se admite tanto en tiempo de ejecución como en tiempo de compilación. La sobrecarga de funciones es un ejemplo de polimorfismo en el momento de la compilación. En C++ el polimorfismo en tiempo de ejecución, se logra mediante el uso de herencia y funciones virtuales.

4 Supongamos un juego de Ajedrez. El Juego esta compuesto por un tablero y 16 piezas, las piezas se agregan al tablero y el Jugador puede moverlas. Todas las piezas se pueden mover de lugar, sólo que las reglas de movimiento son diferente para cada una. El siguiente diagrama de clases podría ser una opción para modelar el comportamiento del sistema. Este modelo es muy poco flexible; cuando se le envía el mensaje mostraTablero al Tablero, éste debe enviar un mensaje a cada objeto de tipo Ficha para que muestre su forma. Pero, cada vez que una Ficha reciba ese mensaje, debe hacerse un condicional para determinar que tipo de ficha es, y así poder determinar la forma que será mostrada (esto conlleva un mayor tiempo de ejecución para mostrarTablero) Algo similar sucede cuando el tablero reciba el mensaje ubicarFicha, en este caso es necesario validar si la ficha a ser ubicada, puede realizar ese movimiento de acuerdo a las reglas del juego. Cuando la ficha recibe el mensaje validarMovimiento se hace un condicional para determinar en primer lugar, el tipo de ficha, y posteriormente revisar si el movimiento es válido para ese tipo de ficha (La codificación se vuelve mas compleja) El problema se puede resolver haciendo que la ficha pueda adoptar diferentes formas y los métodos mostrar y validarMovimiento, respondan acorde a la forma actual del objeto. para ello es necesario tener una representación abstracta de la clase Ficha y una jerarquía de herencia.

5 Ahora la Ficha es una clase abstracta, lo que indica que no se pueden crear objetos de la clase pero puede almacenar referencias a objetos de sus clases derivadas La Clase Juego tiene un vector de fichas, cuando los objetos del vector sean creados, se instanciaran objetos de las clases hijas de Ficha de acuerdo a como se indica en la nota del diagrama. Los métodos mostrar() y validarMovimiento() de la clase Ficha, no tienen conocimiento del tipo de ficha, por tal motivo no son implementados (sin código) y por ende se dicen que son abstractos En las clases hijas se escribe el código de cada método, porque es allí donde se sabe como se debe responder, por ejemplo en la Clase caballo, el método mostrar dibujaría la forma de un caballo, pero en la Clase Rey el método mostraría la forma de un rey Cuando el Tablero reciba el mensaje mostrarTablero, éste solicitará a cada ficha que muestre su forma, enviando el mensaje mostrar(), por medio del polimorfismo en tiempo de ejecución, se llamaría a la implementación correcta del método, ya que el sistema examina el tipo de referencia que tiene la ficha y se comunica con la clase correcta, es decir, si la ficha guarda una referencia a la reina, se llamará al método mostrar de la clase reina El polimorfismo se resuelve en tiempo de ejecución, ya que es allí donde se sabe el tipo de referencia que se guarda en la variable. De igual forma, cuando se llame al método ubicar Ficha, éste a su vez debe llamar al método validarMovimiento para verificar que sea válido, si la ficha guarda una referencia a una Torre, se enviará el mensaje a la Torre y allí se validaría de acuerdo a la forma en que se mueve la torre, si se tiene una referencia a un Alfil el mensaje se dirige hacia la clase Alfil y así para cualquier otro tipo de referencia. Las Clases hijas de la clase abstracta que implementen los métodos virtuales (abstractos) se denominan clases concretas

6 El concepto de clase abstracta está ligado completamente al concepto de polimorfismo, de tal forma que si su programa no necesita polimorfismo tampoco necesitará una clase abstracta. Una clase abstracta permite definir acciones comunes para un conjunto de clases, pero las reacciones finales de las clases a cada una de las acciones es diferente. Cuando una clase se define abstracta, no es posible crear instancias de ella, pero puede guardar referencias a los hijos. Un ejemplo de ello es que todas las piezas del tablero de ajedrez pueden moverse (acción común) pero la forma como se mueven es diferente para cada una de las clases (un caballo no se mueve igual que un peón)

7 Los métodos que cambian el comportamiento en las clases hijas deben ser declarados como virtuales (abstractos), y en la mayor parte de los casos no llevan código. La clase abstracta puede tener métodos que no sean virtuales, es decir, su comportamiento es el mismo para las clases heredadas. Una clase abstracta puede tener constructores, que serán llamados desde los constructores de las clases hijas.

8 La clase Ficha es abstracta porque al menos uno de sus métodos es virtual puro. Constructor de la Clase Ficha, solo puede ser llamado desde los constructores de las clases hijas. Mostrar es una función virtual pura que no provee una implementación, por esta razón esta igualada a cero. Otra función virtual pura sin implementar, ya que no es posible saber como validar el movimiento de la ficha en esta clase. Mover no es un método virtual, ya que para mover cualquier Ficha simplemente se cambian sus coordenadas

9 La Clase Rey hereda de la Clase Ficha y redefine los métodos virtuales. La función mostrar imprime por pantalla DK o LK dependiendo si es un Rey negro o Blanco Se valida que el rey solo pueda avanzar o retroceder una casilla en cualquier dirección siempre y cuando la casilla no este ocupada por una ficha del mismo color El Caballo también es una ficha y debe redefinir los métodos virtuales Mostrar imprime DN o LN conforme a si es un caballo negro o blanco. Se valida que el caballo solo pueda posarse en una casilla desocupada, u ocupada por una ficha de otro color, y que se mueva en forma de L

10 Se crea el vector donde serán guardadas las piezas, este vector debe ser un puntero de la clase base Por la referencia que tenga pieces[i]. para este caso, las 4 primeras veces se llama la implementación para el caballo y las dos restantes se llama la del Rey Lo anterior es posible gracias al polimorfismo. Este tipo de polimorfismo es resuelto al momento de ejecutar el programa Para la función mover no se aplica polimorfismo en tiempo de ejecución debido a que no es un método virtual ¿Cómo sabe el sistema que implementación del método será llamada? Se crean los objetos de las clases concretas y se guardan en el vector de Fichas La regla no ha sido alterada, solo que tanto el caballo como el Rey siguen siendo Fichas y por tal motivo se pueden guardar en un vector de la clase Ficha ¿Cómo?¿No es que un vector solo puede guardar valores de un solo tipo?

11  La clave de la utilización de funciones virtual para lograr el polimorfismo en el momento de la ejecución es que se debe acceder a esas funciones mediante el uso de un puntero declarado como puntero de la clase base.  Debe entenderse que al realizar la herencia existe una jerarquía de clases que va desde la mayor generalización a la menor.


Descargar ppt "Prof. Manuel B. Sánchez.  El origen del término polimorfismo es simple: proviene de las palabras griegas poly (muchos) y morphos (forma) multiforme."

Presentaciones similares


Anuncios Google