Ir al contenido



Foto

Concepto: Polimorfismo


  • Por favor identifícate para responder
15 respuestas en este tema

#1 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.280 mensajes
  • LocationArgentina

Escrito 18 diciembre 2008 - 12:19

Buenos días,
En otra ocasión se ha hablado sobre el tema de la herencia (http://delphiaccess....cepto-herencia/).
De la mano de éste concepto viene el polimorfismo. En esta oportunidad voy a ser más específico en esta potente capacidad.

Concepto
El polimorfismo es, en forma técnica, la capacidad que tiene un objeto de responder de múltiples formas a un mensaje en función de los parámetros que le son suministrados.

En forma sencilla, podemos decir que el polimorfismo es la capacidad que tienen los objetos de una clase de hacer diferentes cosas con un mismo método.

Caso Práctico
Si recuerdan del artículo anterior, habrán notado que se redefinió el método MuestraDatos en TPerro para añadir algo nuevo al MuestraDatos de TMamifero. Eso es polimorfismo, puesto que dependiendo del tipo (clase), se hace una u otra cosa. Como ven, el nombre no ha cambiado nada, sigue siendo el mismo.

Cuando mencioné el concepto he dicho "en función de los parámetros que le son suministrados". No vemos ningún parámetro en MostrarDatos ¿no?. En realidad hay uno pero se dá implícitamente: self. este parámetro se envía con el método sin intervención del programador. El compilador solito hace el trabajo.
¿Porqué existe ese parámetro? Existe por una razón: identificar la clase y al objeto que lo invoca. Sin éste, el compilador no sabría a quien le pertenece el método. En el caso de MostrarDatos, se usa a "Self" para verificar si debe aplicar MostrarDatos de la clase base o de una hija.

Repetiré el ejemplo para ser más gráfico:
 


delphi
  1. type
  2.   TMamifero = class(TObject)
  3.   ...
  4.   procedure MostrarDatos; virtual;
  5.   end;
  6.  
  7.   TPerro =class(TMamifero)
  8.   ...
  9.   procedure MostrarDatos; override;
  10.   end;

Para trabajar con ambos hacemos algo como esto:
 


delphi
  1. var Mamifero: TMamifero;
  2.      Perro: TPerro;
  3. begin
  4.     Mamifero := TMamifero.Create;
  5.     ...
  6.     Mamifero.MostrarDatos;
  7.    
  8.     Perro := TPerro.Create;
  9.     ...
  10.     Perro.MostrarDatos;
  11. end;

¿Me creerían que podemos trabajar con ambas clases, sin depender de si es TPerro, o TMamifero, TGato o cualquier descendiente que se plantee a TMamifero?.
Si, si se puede. Y eso es otra de las ventajas que nos ofrece el polimorfismo: trabajar con muchas clases, independiente del tipo (clase). Operaremos de forma común a todas ellas, y por tanto es necesario que existe una clase base común a todas.

Esto nos permite hacer cosas como esto:
 


delphi
  1. var
  2.   Mamifero: TMamifero;
  3. begin
  4.   Mamifero := TMamifero.Create;
  5.   ...
  6.   Mamifero.MostrarDatos; // ejecutará el MostrarDatos de TMamifero
  7.  
  8.   Mamifero := TPerro.Create; // Si, ¡está bien! Es polimorfirmo
  9.   ...
  10.   Mamifero.MostrarDatos; // ejecutará el MostrarDatos de TPerro
  11. end;

Como ven, tenemos una variable de clase TMamifero y con esta misma variable podemos "jugar" con distintos animales que desciendan de TMamifero. Esto es posible gracias a aquel "self" que he comentado antes.

Pero no es posible hacer algo como esto:
 


delphi
  1. var Perro: TPerro;
  2. begin
  3.   Perro := TMamifero.Create; // ¡El compilador nos da error!
  4. end;

¿Porqué la inversa no es posible? Porque podemos inferir que todo perro es un mamífero, pero no que todo mamífero es un perro. Técnicamente el compilador determina si en la tabla de memoria, es posible dicha asignación.

El polimorfismo funciona siempre y cuando los descendientes tengan algo en "común".

Espero que este mini ejemplo ilustre de forma más completa el concepto de polimorfismo.

Saludos,


  • 0

#2 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 18 diciembre 2008 - 12:26

Hola
Muy interesante amigo.
Gracias por el aporte. (y)
Saludos
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.043 mensajes
  • LocationMéxico

Escrito 18 diciembre 2008 - 12:28

Que bien amigo Delphius,

Gracias por el aporte, muy bien explicado, esto se está poniendo interesante, espero que mas compañeros se animen a colocar tutoriales sobre tantas cosas que hay en Delphi. ;) :)

Salud OS
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.280 mensajes
  • LocationArgentina

Escrito 18 diciembre 2008 - 12:32

Gracias amigos, :)
Espero no haber sido demasiado técnico.

Ahora, una pregunta off-topic:
¿Porqué siempre se escucha hablar de perros, gatos, y animales en general cuando se habla de temas POO? ¿Será que somos tan animales los programadores? :D :|

Saludos,
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.043 mensajes
  • LocationMéxico

Escrito 18 diciembre 2008 - 12:42

Gracias amigos, :)
Espero no haber sido demasiado técnico.

Ahora, una pregunta off-topic:
¿Porqué siempre se escucha hablar de perros, gatos, y animales en general cuando se habla de temas POO? ¿Será que somos tan animales los programadores? :D :|

Saludos,


:D :D :D, eso mismo me preguntaba yo, lo que pasa es que es mas facil hablar de perros, gatos que de negros, chinos, latinos, etc....

Otro ejemplo clasico es el de Personas, Clientes , Proveedores y Empleados :p

Salud OS
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.280 mensajes
  • LocationArgentina

Escrito 18 diciembre 2008 - 01:03

Jaja. :D
Me haces reír.
¡Es cierto! Ese es otro ejemplo muy visto.

Si me disculpan hoy estoy un tantito inspirado y voy a tratar el tema de sobrecarga (overload).

Saludos,
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.043 mensajes
  • LocationMéxico

Escrito 18 diciembre 2008 - 01:10

Jaja. :D
Me haces reír.
¡Es cierto! Ese es otro ejemplo muy visto.

Si me disculpan hoy estoy un tantito inspirado y voy a tratar el tema de sobrecarga (overload).

Saludos,


Por favor amigo Delphius esta es tu casa y puedes hacer lo que quieras, aquí nadie te va a criticar por tener muchos post :p

Salud OS
  • 0

#8 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.940 mensajes
  • LocationMéxico

Escrito 18 diciembre 2008 - 01:49

Gracias amigos, :)
Espero no haber sido demasiado técnico.

Ahora, una pregunta off-topic:
¿Porqué siempre se escucha hablar de perros, gatos, y animales en general cuando se habla de temas POO? ¿Será que somos tan animales los programadores? :D :|

Saludos,


Interesante pregunta y que de hecho me ha traido a la memoria un libro de programación orientada a objetos que en su portada traía un ornitorrinco como ejemplo máximo del polimorfismo.

Saludos
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.280 mensajes
  • LocationArgentina

Escrito 18 diciembre 2008 - 01:55


Interesante pregunta y que de hecho me ha traido a la memoria un libro de programación orientada a objetos que en su portada traía un ornitorrinco como ejemplo máximo del polimorfismo.

Saludos

:o
Amigo, ¡dime que recuerdas al nombre del libro y al autor!. Es el mismo libro que yo he seguido. Estuve buscando en mi cerebro (y en internet) desde hace meses al autor y el nombre pero no lo recuerdo ni encuentro. En muchas ocasiones cuando quiero comentar (y recomendar) a alguien sobre dicho libro los remito al "libro del ornitorrinco".
Me sacarías una duda tremenda.

Saludos,
  • 0

#10 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.940 mensajes
  • LocationMéxico

Escrito 18 diciembre 2008 - 03:28

fijate que ese libro lo tuve y de hecho fué parte de la literatura que estudié en mi segundo semestre de la licenciatura. Pero desgraciadamente perdí el libro allá por el 2,001 :


  • 0

#11 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 18 diciembre 2008 - 03:42

fijate que ese libro lo tuve y de hecho fué parte de la literatura que estudié en mi segundo semestre de la licenciatura. Pero desgraciadamente perdí el libro allá por el 2,001 :



Ese formato para los años, ¿ lo aprendistes en ese libro? :p

Un Saludo.

PD:Interesante el tema. (y)

#12 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.940 mensajes
  • LocationMéxico

Escrito 18 diciembre 2008 - 04:06

como no pude resistir tentación de retomar ese libro aca está la info del mismo:



Imagen Enviada


http://www.amazon.co...d/dp/0201824191
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.280 mensajes
  • LocationArgentina

Escrito 18 diciembre 2008 - 06:41

¡Gracias Poli!
Te agradezco el dato. Timothy Budd. Voy a ver si logro encontrarlo en alguna librería, sino a pelear por una copia en Amazon. Un libro como ese no debería faltar en nnguna biblioteca de un informático.
Desde que aprobé Lenguajes IV hace años, ni busqué libro sobre POO. No me se me dió por comprarlo. Me he tenido que manejar estos años con la teoría que recuerdo, complementada con lo de Ian y Craig.

Saludos,
  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 19 diciembre 2008 - 09:00

Muy bueno el tutorial amigo Delphius, eso es algo que necesitaba aprender, cuando tenga tiempo tratare de leerlo detenidamente y con mas calma y aplicar los ejemplos.

Saludos.
  • 0

#15 ANTONIO MORALES

ANTONIO MORALES

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 12 julio 2016 - 07:32

Hola a todos, los conceptos y la explicación están bien pero se debe corregir la declaración inicial:

delphi
  1. TMamifero = Class(tObject)
  2.      procedure MostrarDatos; virtual;
  3.   end;
  4.   TPerro =class(tMamifero)//<--Aqui
  5.     procedure MostrarDatos; override;
  6.   End;

 
si el método Mostrar datos de perro va a sobreescribir a la de mamifero, la clase Perro debe descender de Mamifero.
 
Un saludo
  • 1

#16 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.280 mensajes
  • LocationArgentina

Escrito 12 julio 2016 - 12:27

 

Hola a todos, los conceptos y la explicación están bien pero se debe corregir la declaración inicial:

 

TMamifero = Class(tObject)
     procedure MostrarDatos; virtual;
  end;
  TPerro =class(tMamifero)
    procedure MostrarDatos; override;
  End;
 
si el método Mostrar datos de perro va a sobreescribir a la de mamifero, la clase Perro debe descender de Mamifero.
 
Un saludo

 

 

Muchas gracias por la aclaración. Una errata de mi parte.

Ya mismo lo corrijo.

 

Saludos,


  • 0