‒ Polimorfismo en listas y colecciones.
Una lista, como mencione anteriormente es una lista de punteros, y por lo tanto este puede almacenar cualquier puntero que le colocásemos, es decir podemos colocar un puntero que apunte a un entero, a un registro, a un número real o a un objeto. Esto nos permite tener una lista de elementos bastante heterogéneos, pero el único inconveniente es saber a que apunta un puntero para poder acceder al mismo. Una lista con elementos heterogéneos es mejor implementarlo con objetos, ya que este tiene los medios para saber de antemano a que clase pertenece un determinado objeto, y esto se consigue con la ayuda del operador is.
En este ejemplo se puede ver que a la variable aux, se le hace un solapamiento con la clase del cual deseamos saber si es o no un objeto de esa clase, al hacer el solapamiento en realidad no estamos convirtiendo a la variable aux en un objeto de esa clase, si no que le indicamos que ese objeto debe interpretarse como un objeto de esa clase, para después verificar si realmente lo es, con el operador is.
El ejemplo que vimos anteriormente nos muestra como crear una lista heterogénea de objetos, en donde podemos observar que los objetos no pertenecen a una jerarquía de clases en particular, esto hace que cuando queramos mostrar los datos correspondientes a cada objeto de la lista, se tiene que comprobar si el objeto pertenece a la clase correspondiente para poder ejecutar el método mostrar correspondiente.
El Polimorfismo nos permite evitar esta serie de comprobaciones, siempre y cuando el objeto pertenezca a una jerarquía de clases, en el siguiente ejemplo, la clase padre será TNumero, que tendrá un método abstracto virtual que será sobrescrito por todos las clases que lo hereden.
En este ejemplo se puede observar ahora que la variable aux, solamente se le hace un solapamiento con la clase padre para que pueda ejecutar el método Mostrar correspondiente, ya no es necesario hacer comprobaciones con el uso del operador is.
En el caso de Colecciones, también se pueden hacer listas heterogéneas, pero para ello los nuevos objetos se añadirán a la colección con el uso de su constructor create, pero colocando en su parámetro la colección a la cual pertenecerán. Obviamente estos nuevos objetos deben ser subclases de la clase padre que use la colección. Ejemplo:
En este ejemplo se puede observar como se crean los estudiantes usando sólo aux, que es un objteo de la clase padre TPersona, y como mencioné anteriormente al crear el nuevo estudiante este se hace con su constructor create, colocando en su parámetro la colección Personas. Si se tiene una clase que es descendiente de TCollectionItem, pero no descendiente de la clase TPersona y luego intentásemos crear un objeto de esa clase para añadirlo a la colección Personas, con el constructor create, este no se añadirá a la colección, ya que no es descendiente de la clase padre que usa la colección Personas. Es decir sólo se pueden añadir con el constructor create de TCollectionItems, objetos que pertenezcan o sean subclase de la clase padre que use la colección.