[ Foro de Pascal ]

Duda sobre el Tema16.d sobre POO en pascal.

17-May-2013 05:04
Luis Torres (+12)
1 Respuestas

Tengo una duda sobre el Tema 16d del tutorial de Programación Orientada a Objetos. Voy a copiar y pegar la parte que me genera la duda:
"Si lo ejecutais vereis que no: el título que corresponde a T3 no ha salido con los mismos colores de antes (blanco parpadeante sobre azul claro) sino con los que corresponden a T2 (amarillo sobre verde)."
...
"Cuando el compilador ve que el método AsignaYEscribe llama a Escribe, enlaza cada AsignaEscribe con su Escribe correspondiente.  Pero para "TituloParpadeo" no existe Escribe, así que ¿qué hace?  Pues toma el más cercano, el de su padre, TítuloColor."

Mi razonamiento es el siguiente: cuando se llama al procedimiento Escribe directamente, sin haber sido llamado desde el procedimiento AsignaYEscribe, también se está llamando al procedimiento Escribe de su padre TituloColor, y presenta tanto el texto como los colores que se quieren mostrar.
Otro razonamiento que hago es, si al llamar a Escribe desde AsignaYEscribe muestra los colores del padre, ¿entonces por qué no muestra también el texto del padre?.
Les agradecería que aclaran mis dudas.
Saludos.


17-May-2013 09:41
Nacho Cabanes (+31)

La idea es que si no usas la palabra "virtual", no comprueba en tiempo de ejecución a qué clase corresponde cada método, sino que "da las cosas por supuestas".

Si en una clase no existe "Escribe", puede dar por sentado cuando llamas a ese método que estarás hablando de otro objeto, que pertenece a la clase superior, y tomará (sólo) los detalles de esa clase superior, sin tener en cuenta las funcionalidades extra (ni los datos extra) que añadiera la clase que realmente tú estás utilizando.

Por eso, lo habitual "en el mundo real" es que los métodos que se hereden de una clase a otra sean (casi) siempre virtuales, de modo que el compilador no dé cosas por supuestas, y las compruebe realmente cuando tu programa las use. El programa resultante será ligeramente más lento... pero funcionará correctamente.  ;-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)