BotonMenu
BotonIndice

Visita : http://www.conoce3000.com
Paypal : https://www.paypal.me/conoce3000/1

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


13. LISTAS Y COLECCIONES.
13.5. GENERALIZACIÓN DE LISTAS Y COLECCIONES.
13. LISTAS Y COLECCIONES.
13.5. GENERALIZACIÓN DE LISTAS Y COLECCIONES.
13. LISTAS Y COLECCIONES.
13.5. GENERALIZACIÓN DE LISTAS Y COLECCIONES.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Generalización de listas y colecciones.

La generalización es un relación de herencia, esta relación nos permite implementar nuestras propias colecciones y listas, para nuestros usos más particulares.

Para explicar la generalización de listas y colecciones, crearemos una pila, una pila es una estructura como una lista en la que sólo tiene dos métodos uno para poner elementos y otro para extraerlos. En una pila el último elemento colocado en la estructura es el primero en ser extraído.

Para la implementación de una pila usando Tlist, se hará aprovechando los métodos Add, la propiedad items y el atributo Count. Nuestra pila ha de consistir de dos métodos pop y push, push se encargará de colocar los elementos a la pila y pop se encargará de extraerlos. El método pop debe ser una función que devuelve el puntero extraído de la lista para ser usado posteriormente. A continuación el código fuente, que implementa la pila.


Descargar
{$codepage utf8}
{$mode objfpc}
Uses sysutils,classes;

Type TPila=class(TList)
       procedure Push(p:pointer);
       function Pop:pointer;
     End;

     Procedure TPila.Push(p:pointer);
       Begin
         add(p)
       End;

     Function TPila.Pop:pointer;
       Begin
         Pop:=items[Count-1];
         Delete(Count-1)
       End;

Var Pila:TPila;
    n:^integer;
    i:byte;
Begin
  randomize;
  Pila:=TPila.create;

  for i:=0 to 5 do
    begin
      new(n);
      n^:=random(1000);
      Pila.Push(n);
      Writeln(integer(Pila.items[i]^))
    end;

  Writeln('Capacidad = ',Pila.Capacity);
  Writeln('Cantidad = ',Pila.Count);

  Writeln;
  for i:=0 to 5 do
    begin
      n:=Pila.pop;
      Writeln(n^);
      freemem(n)
    end;

  Writeln('Capacidad = ',Pila.Capacity);
  Writeln('Cantidad = ',Pila.Count);

  Pila.destroy

End.
Código fuente 18: Una pila con listas.
Descargar

El método pop, también se pudo haber implementado usando el método Extract, pero este método lo que hace es buscar un puntero en la lista, lo que lo hace la opción más lenta en caso tengamos una pila enorme de elementos.

Para implementar una pila usando colecciones, entonces se necesitarán usar la propiedad itemclass, esta propiedad es una referencia de clase, de la clase que se usa para crear los objetos de una colección. Además se debe usar también los métodos Add y delete, así como también sobrescribir el método Assign para los objetos que se usarán en la colección. A continuación el ejemplo.


Descargar
{$codepage utf8}
{$mode objfpc}
Uses sysutils,classes;

Type
    TInteger=class(TCollectionItem)
      public
       n:integer;
       procedure Assign(source:TPersistent);override;
     End;

    TPila=class(TCollection)
      function push:TCollectionItem;
      function pop:TCollectionItem;
    End;

    Procedure TInteger.Assign(source:TPersistent);
     Begin
       if Source is TInteger then
          n := TInteger(Source).n
       else
          inherited Assign(Source)
     End;

    Function TPila.push:TCollectionItem;
     Begin
        push:=Add
     End;

    Function TPila.pop:TCollectionItem;
     var aux:TCollectionItem;
     Begin
       aux:=ItemClass.create(nil);
       aux.Assign(items[Count-1]);
       pop:=aux;
       Delete(Count-1)
     End;

Var Pila:TPila;
    n:TInteger;
    i:integer;
Begin
  randomize;
  Pila:=TPila.create(TInteger);

  for i:=0 to 5 do
    begin
      n:=TInteger(Pila.push);
      n.n:=random(1000);
      Writeln(n.n)
    end;

  Writeln('ColeccionN');
  Writeln('Cantidad = ',Pila.Count);

  for i:=0 to 5 do
    Begin
      n:=TInteger(Pila.pop);
      Writeln(n.n)
    End;

  Writeln('ColeccionN');
  Writeln('Cantidad = ',Pila.Count);
  Pila.free
End.
Código fuente 19: Una pila con colecciones.
Descargar

En este ejemplo se puede observar que en el método pop, se hace uso de ItemClass, para crear un nuevo objeto, que en este ejemplo será de la clase Tinteger, ya que ItemClass es una referencia de clase justamente de Tinteger, que es la que esta usando nuestra Pila. También se puede observar que hacemos uso del método create con el parámetro puesto a nil, esto es así ya que lo que queremos es cree un objeto que no corresponda a ninguna colección. Después de crear el objeto que devolverá el método pop, se le asigna los atributos del objeto que esta en la pila hacia el nuevo objeto creado, todo esto con el método Assign, finalmente se borra el objeto que esta en la pila.




SIGUIENTE
SIGUIENTE
SIGUIENTE



 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo (a través de Paypal me), 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.


Comments System WIDGET PACK






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.