BotonMenu
BotonIndice

Visita : conoce3000.com
Paypal : https://www.paypal.com/donate/?hosted_button_id=XY8TZ3MGN64GE

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


13. LISTAS Y COLECCIONES.
13.7. POLIMORFISMO EN LISTAS Y COLECCIONES.
13. LISTAS Y COLECCIONES.
13.7. POLIMORFISMO EN LISTAS Y COLECCIONES.
13. LISTAS Y COLECCIONES.
13.7. POLIMORFISMO EN LISTAS Y COLECCIONES.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ 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.


Descargar
{$codepage utf8}
{$mode objfpc}

Uses sysutils,classes;
Type
  TNumeroCad = class
    n:string;
    Procedure Mostrar;
  End;

  TInteger = class
    n:integer;
    Procedure Mostrar;
  End;

  TDouble = class
    n:double;
    Procedure Mostrar;
  End;

  Procedure TInteger.Mostrar;
   Begin
     Writeln('Entero : ',n:3);
   End;

  Procedure TDouble.Mostrar;
   Begin
     Writeln('Doble : ',n:3:3);
   End;

  Procedure TNumeroCad.Mostrar;
   Begin
     Writeln('Cadena : ',n)
   End;

Var
 Lista:TList;
 n01:Tinteger;
 n02:Tdouble;
 n03:TNumeroCad;
 i,j:integer;
 aux:pointer;

Begin
  Randomize;
  Lista:=TList.create;
  for i:=0 to 12 do
   Begin
    j:=random(3);
    Case j of
      0:Begin
          n01:=TInteger.create;
          n01.n:=i;
          Lista.add(n01)
        End;
      1:Begin
          n02:=TDouble.create;
          n02.n:=i;
          Lista.add(n02)
        End;
      2:Begin
         n03:=TNumeroCad.create;
         n03.n:=IntToStr(i);
         Lista.add(n03)
        End;
    End
   End;

  for aux in Lista do
    Begin
      if TNumeroCad(aux) is TNumeroCad then TNumeroCad(aux).Mostrar;
      if TInteger(aux) is TInteger then Tinteger(aux).Mostrar;
      if TDouble(aux) is TDouble then TDouble(aux).Mostrar
    End

End.
Código fuente 23: Una lista heterogenea.
Descargar

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.


Descargar
{$codepage utf8}
{$mode objfpc}

Uses sysutils,classes;
Type
  TNumero = class
    Procedure Mostrar;virtual;abstract;
  End;

  TNumeroCad = class(TNumero)
    n:string;
    Procedure Mostrar;override;
  End;

  TInteger = class(TNumero)
    n:integer;
    Procedure Mostrar;override;
  End;

  TDouble = class(TNumero)
    n:double;
    Procedure Mostrar;override;
  End;

  Procedure TInteger.Mostrar;
   Begin
     Writeln('Entero : ',n:3)
   End;

  Procedure TDouble.Mostrar;
   Begin
     Writeln('Doble : ',n:3:3)
   End;

   Procedure TNumeroCad.Mostrar;
   Begin
     Writeln('Cadena : ',n)
   End;

Var
 Lista:TList;
 n01:Tinteger;
 n02:Tdouble;
 n03:TNumeroCad;
 i,j:integer;
 aux:pointer;
Begin
  Lista:=TList.create;
  randomize;
 for i:=0 to 12 do
   Begin
    j:=random(3);
    Case j of
      0:Begin
          n01:=TInteger.create;
          n01.n:=i;
          Lista.add(n01)
        End;
      1:Begin
          n02:=TDouble.create;
          n02.n:=i;
          Lista.add(n02)
        End;
      2:Begin
         n03:=TNumeroCad.create;
         n03.n:=IntToStr(i);
         Lista.add(n03)
        End;
    End
   End;

  for aux in Lista do
      TNumero(aux).Mostrar
End.
Código fuente 24: Una lista heterogenea con polimorfismo.
Descargar

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:


Descargar
{$codepage utf8}
{$mode objfpc}

Uses sysutils,classes;

Type

   TPersona=class(TCollectionItem)
     public
      Nombre:ansistring;
      procedure Mostrar;virtual;
   End;

   TEstudiante=class(TPersona)
     public
      grado:byte;
     procedure Mostrar;override;
   End;

   Procedure TPersona.Mostrar;
     Begin
      Writeln(Nombre);
     End;

   procedure TEstudiante.Mostrar;
     Begin
       Writeln(Nombre,', grado:',grado);
     End;

Var Personas:TCollection;
    aux:TPersona;
    i,j:byte;
Begin
  Personas:=TCollection.create(TPersona);
  Randomize;
  for i:=0 to 15 do
   Begin
     j:=random(2);
     Case j of
       0:Begin
          Personas.Add;
          TPersona(Personas.items[i]).Nombre:='Persona'
         End;
       1:Begin
          aux:=TEstudiante.create(Personas);
          With TEstudiante(aux) do
            Begin
              Nombre:='Estudiante';
              grado:=i
            End
         End;
     End
   End;

   for TCollectionItem(aux) in Personas do aux.Mostrar
End.
Código fuente 25: Una lista heterogenea con polimorfismo.
Descargar

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.




SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo a través de , que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado. Para clases particulares contactame por whatsapp al 📲 (+51) 999 264 073








PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.