Recent

Author Topic: problema con metodo abstracto  (Read 996 times)

zelda16bit

  • Full Member
  • ***
  • Posts: 107
problema con metodo abstracto
« on: December 28, 2022, 05:12:56 pm »
Code: Pascal  [Select][+][-]
  1. unit Upadre;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Allegro5,Generics.Collections;
  9.  
  10. type
  11.   Tpadre = class
  12.     strict private
  13.       padre: Tpadre;
  14.       lista: specialize TObjectList<Tpadre>;
  15.     public
  16.       constructor Create();
  17.       procedure pintar();virtual;abstract;
  18.       procedure actualizar();
  19.       destructor Destroy(); override;
  20.   end;
  21.  
  22. implementation
  23.  
  24.   constructor Tpadre.Create();
  25.   begin
  26.     lista := specialize TObjectList<Tpadre>.Create(True);
  27.     lista.Add(Self);
  28.   end;
  29.  
  30.   procedure Tpadre.actualizar();
  31.   begin
  32.     for padre in lista do begin
  33.       padre.pintar();
  34.     end;
  35.   end;
  36.  
  37.   destructor Tpadre.Destroy();
  38.   begin
  39.     lista.Free();
  40.     lista := nil;
  41.   end;
  42.  
  43. end.
  44.  
  45.  

He creado el metodo abstracto pintar para utilizarlo en las clases hijas que hereden de esta,en la clase padre no lo voy a utilizar solo en las hijas pero en el metodo actualizar lo llamo porque este metodo se encargara de actualizar todos lo metodos pintar de todas las clases hijas, sin embargo me dice el compilador que no se puede usar y me da error.

¿Cual es la manera de solucionar este problema?
« Last Edit: January 05, 2023, 07:36:22 pm by zelda16bit »

janasoft

  • New Member
  • *
  • Posts: 20
Re: problema con metodo abstracto
« Reply #1 on: December 29, 2022, 12:12:29 pm »
Buenos días.
Si lo vas a utilizar en la propia clase creo que debes eliminar la declaración 'abstract'.
Con que tengas 'override' es suficiente para poder declararlo en las clases descendientes.
Saludos
Lazarus v1.0.14 + FPC:2.6.2 + W8 64 bits

Edson

  • Hero Member
  • *****
  • Posts: 1261
Re: problema con metodo abstracto
« Reply #2 on: December 29, 2022, 02:27:30 pm »
¿Cuál es el error que te muestra el compilador?
Lazarus 2.0.10 - FPC 3.2.0 - x86_64-win64 on Windows 8

zelda16bit

  • Full Member
  • ***
  • Posts: 107
Re: problema con metodo abstracto
« Reply #3 on: December 29, 2022, 07:51:40 pm »
Buenos días.
Si lo vas a utilizar en la propia clase creo que debes eliminar la declaración 'abstract'.
Con que tengas 'override' es suficiente para poder declararlo en las clases descendientes.
Saludos

Si quito la declaracion 'abstract' me la marca en rojo y  me dice:
-error Forward declaration not solvet "pintar;"

zelda16bit

  • Full Member
  • ***
  • Posts: 107
Re: problema con metodo abstracto
« Reply #4 on: December 29, 2022, 07:54:23 pm »
¿Cuál es el error que te muestra el compilador?

Me sale una ventana con este mensaje:

-El proyecto alegro10 ha lanzado una excepcion de la clase 'RunError(211)'

En archivo 'Upadre.pas' en linea 41:
padre.pintar();

Si le doy a ignorar la excepcion y le doy a continuar me sale otra ventana con este mensaje:

El proyecto alegro10 ha lanzado una excepcion 'EAbstractError': con el mensaje Abstract method called

Si le vuelvo a ignorar la excepcion el programa se cierra sin mas.

Edson

  • Hero Member
  • *****
  • Posts: 1261
Re: problema con metodo abstracto
« Reply #5 on: January 02, 2023, 05:13:15 pm »
Por los mensajes puedo deducir que el problema se produce al llamar al método abstracto pintar().

La declaración de la clase está bien, pero parece que no hay ninguna implementación para la clase Tpadre en alguna clase hija.

Si pintar() es VIRTUAL ABSTRACT, debería existir al menos una clase hija para instanciar un objeto de la clase hija, ya que como Tpadre es una clase abstracta, no soporta instancias.
Lazarus 2.0.10 - FPC 3.2.0 - x86_64-win64 on Windows 8

zelda16bit

  • Full Member
  • ***
  • Posts: 107
Re: problema con metodo abstracto
« Reply #6 on: January 03, 2023, 08:50:06 pm »
Pero yo no quiero que Tpadre sea abstracta,solo quiero que sea abstracto el metodo pintar.La clase padre no la voy a instanciar solo voy a usar el metodo actualizar para llamarlo desde el archivo principal para que me actualize todos los metodos pintar de las clases hijas y lo usare como un metodo de clase para no tener que instanciar la clase padre.

Tengo una clase hija que hereda de la clase padre y se instancia en otra clase asi que no se porque no funciona,la verdad es que cada vez que intento hacer algo con freepascal tengo bastantes problemas,esta claro que me faltan datos y no se hacer correctamente las cosas.Un saludo y feliz año

Edson

  • Hero Member
  • *****
  • Posts: 1261
Re: problema con metodo abstracto
« Reply #7 on: January 03, 2023, 09:37:41 pm »
Pero yo no quiero que Tpadre sea abstracta,solo quiero que sea abstracto el metodo pintar.La clase padre no la voy a instanciar solo voy a usar el metodo actualizar para llamarlo desde el archivo principal para que me actualize todos los metodos pintar de las clases hijas y lo usare como un metodo de clase para no tener que instanciar la clase padre.

Basta que una clase tenga un método abstracto para hacer a la clase abstracta. Eso implica que no puedes crear instancias de la clase abstracta Tpadre.

¿Método de clase para no tener que instanciar la clase padre? Creo que estás confundiendo conceptos.

Sospecho que lo que prentendes hacer es un simple polimorfismo, pero es difícil verlo si no tienes un código completo de demostración.
Lazarus 2.0.10 - FPC 3.2.0 - x86_64-win64 on Windows 8

zelda16bit

  • Full Member
  • ***
  • Posts: 107
Re: problema con metodo abstracto
« Reply #8 on: January 04, 2023, 07:53:25 pm »
He subido un zip con todo el codigo para que lo mires si quieres,aunque hay mas problemas a parte del comentado.He intentado subir el zip con todos los archivos pero no me ha dejado subirlo,asi que solo he podido subir el codigo.

Si quieres hacerlo funcionar desde lazarus necesitaras allegro5 de nuño.
https://allegro-pas.sourceforge.net/

Edson

  • Hero Member
  • *****
  • Posts: 1261
Re: problema con metodo abstracto
« Reply #9 on: January 04, 2023, 10:08:38 pm »
He intentado compilar tu código, incluyendo la librería, pero me da errores extraños. Mejor incluye los archivos necesarios de la librería en  dentro del proyecto o reduce tu código de modo que no requiera la librería, de paso que vas descartando por donde va el problema.

Lo que veo extraño en tu definición de clases es que creas una instancia de Tpadre.lista (que es de clase) por cada objeto Tpadre que vas creando. Eso de por sí me parece que te debe generar un error de fuga de memoria.

Te recomendaría no usar instancias de clase para almacenar las referencias a los objetos que vas creando. Puedes usar una lista simple, fuera de la clase.

Lazarus 2.0.10 - FPC 3.2.0 - x86_64-win64 on Windows 8

zelda16bit

  • Full Member
  • ***
  • Posts: 107
Re: problema con metodo abstracto
« Reply #10 on: January 05, 2023, 07:47:09 pm »
He actualizado el archivo con algunos dll pero falta uno porque no me deja subir archivos de mas de 500 kb.Falta el archivo allegro_monolith-5.2.dll que lo encontraras en la carpeta de alegro5/bin/lib/monolith.

Ahora si debe compilar porque he comentado Tpadre.pintar() que es el que da problemas,ademas hay problemas de liberacion de memoria y un problema al llamar al constructor de la clase padre en la clase disparo.

Lo que intento hacer es una lista en la clase padre que se encargue de añadir a la lista las clases que hereden de padre,tambien intento usar el proceso actualizar para actualizar todos los metodos pintar de las clases que hereden de esta,pero para eso tengo que llamar al metodo pintar de la clase padre en el archivo principal si no no sirve,y por ultimo quiero que la clase padre se encargue de liberar la memoria para no tener que hacerlo desde las clases hijas,tambien se necesita un metodo pintar en la clase padre para usarlo en las clases hijas pero el de la clase padre no debe llevar codigo.

Esta claro que no lo estoy haciendo bien por eso necesito orientacion,no me importa cambiar la forma en la que lo estoy haciendo,solo quiero que funcione,por cierto esto ya lo he hecho con processing y lua y no he tenido problemas pero con pascal no funciona de la misma forma.

Edson

  • Hero Member
  • *****
  • Posts: 1261
Re: problema con metodo abstracto
« Reply #11 on: January 12, 2023, 05:57:33 pm »
Hola.

Tu proyecto me da error de ejecución aún incluyendo el dll. Debe ser por el Allegro, que no lo he usado antes. Pero como te decía te recomiendo cambiar la estructura de tu código.

Como ya te había indicado, los problemas de liberación de memoria deben ser por la forma como estás creando "lista" en Tpadre.Create().

Podrías revisar algunos de mis proyectos como ejemplo de administración de objetos gráficos como: https://github.com/t-edson/ogEditGraf/blob/2.8/ogEditionMot.pas

Aquí se crea el contenedor objects  de la clase TlistObjGraf para almacenar los objetos gráficos que se van creando.

La clase base TObjGraf esta definida en https://github.com/t-edson/ogEditGraf/blob/2.8/ogDefObjGraf.pas y el método de dibujo es TObjGraf.Draw() que es definido como virtual.


Lazarus 2.0.10 - FPC 3.2.0 - x86_64-win64 on Windows 8

zelda16bit

  • Full Member
  • ***
  • Posts: 107
Re: problema con metodo abstracto
« Reply #12 on: January 13, 2023, 05:54:02 pm »
Gracias por toda la ayuda Edson,buscare alguna forma de solucionarlo.

 

TinyPortal © 2005-2018