Recent

Author Topic: pregunta sobre referencia de clases  (Read 5073 times)

zelda16bit

  • Full Member
  • ***
  • Posts: 118
pregunta sobre referencia de clases
« on: June 12, 2021, 10:47:32 am »
Hola de nuevo. :)

Estoy en el apartado 9.4 del manual.
https://castle-engine.io/modern_pascal_introduction.html#_class_references

No entiendo los ejemplos que vienen sobre referencia de clase,podriais explicarmelo con algun ejemplo mas sencillo que el que viene en el manual. %)

Edson

  • Hero Member
  • *****
  • Posts: 1296
Re: pregunta sobre referencia de clases
« Reply #1 on: June 12, 2021, 09:15:52 pm »
Tal vez porque no manejas todavía la manipulación de objetos. Es bastante simple una vez que te adecuas.

Los objetos se declaran, se crean y destruyen, de forma normal con el siguiente código:

Code: Pascal  [Select][+][-]
  1.  
  2.   TMyClass = class(TComponent)  //Define clase
  3.     //Definir campos
  4.   end;
  5.  
  6. var
  7.   C: TMyClass;  //Declarar variable
  8. begin
  9.   C := TMyClass.Create(nil);   //Crea objeto
  10.   //Hace algo
  11.   FreeAndNil(C);  //Destruye objeto
  12.   ...
  13.  

Lo que te está indicando es que,  además puedes hacer:

Code: Pascal  [Select][+][-]
  1. var
  2.   C: TMyClass;
  3.   ClassRef: class of TMyClass;  //Referencia a clase
  4. begin
  5.   ClassRef := TMyClass;   //Define la clase a la que apunta ClassRef
  6.   C := ClassRef.Create(nil);   //Crea el objeto de forma normal
  7.   //Hace algo
  8.   FreeAndNil(C);   //Lo destruye
  9.   ...
  10.  

Declarar una variable de tipo: "class of <alguna_clase>" es como declarar una variable común, solo que no guarda valores, sino referencias a "alguna_clase" o a sus clases descendientes.
Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: pregunta sobre referencia de clases
« Reply #2 on: June 12, 2021, 11:25:09 pm »
Gracias por la respuesta Edson. :)

-¿Porque estas heredando de TComponent?
-¿Porque al crear el objeto le pones (nil)?

-Y que utilidad tiene el crear una referencia de clase,no acabo de ver el uso de esto.Si guardo la clase en una variable si le veo la utilidad pero con una referencia no se muy bien que hacer con esto.¿Se puede hacer lo mismo que con una variable(instancia)?

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: pregunta sobre referencia de clases
« Reply #3 on: June 13, 2021, 12:14:08 am »
Obviamente no soy Edosn ;) pero ...
-¿Porque estas heredando de TComponent?
-¿Porque al crear el objeto le pones (nil)?

Como no soy Edosn no se por qué lo hace (aparte de por copiar el ejemplo) pero Usar TComponent (o cualquier otra clase existente, en realidad) permite mostrarlo de un modo un poco más realista. Y dado que el constructor de TComponent está declarado como:
Code: Pascal  [Select][+][-]
  1. constructor TComponent.Create(AOwner: TComponent); virtual;
necesita que le pases un parámetro que, como mínimo, puede ser Nil, significando "Ninguno"

Quote
-Y que utilidad tiene el crear una referencia de clase,no acabo de ver el uso de esto.
Una referencia a una clase es necesaria cuando necesitas hacer operaciones que afectan a la clase en sí misma, como crear una instancia, pero no sabes qué clase te van a pasar, como pasa (aunque no está muy claro, la verdad sea dicha) en el ejemplo al que enlazaste, o para llamar a constructores virtuales.

La verdad es que cómo, cuando y por qué usar referencias de clases es un concepto bastante avanzado y poco usado en programas normales. Si estás empezando, yo que tú memorizaría que existe y volvería a él más adelante ;)
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

Edson

  • Hero Member
  • *****
  • Posts: 1296
Re: pregunta sobre referencia de clases
« Reply #4 on: June 13, 2021, 04:01:55 am »
Ya @lucamar respondió muy bien, a pesar de no ser yo. Pero igual te respondo por si te sirve.

-¿Porque estas heredando de TComponent?

Porque estoy usando el mismo código del ejemplo.

-¿Porque al crear el objeto le pones (nil)?

Porque como se está usando una clase que hereda de TComponent, se hereda también su constructor que requiere un parámetro y que para nuestro caso, basta con ponerlo a NIL.

-Y que utilidad tiene el crear una referencia de clase,no acabo de ver el uso de esto.Si guardo la clase en una variable si le veo la utilidad pero con una referencia no se muy bien que hacer con esto.¿Se puede hacer lo mismo que con una variable(instancia)?

Estos tiene que ver con una especie de polimorfismo a nivel de clases. Su utilidad sería similar a la utilidad del polimorfismo en POO común, pero ahora aplicada a clases. También sirve como una ayuda para implementar ciertos patrones de diseño de POO.

Lo cierto es que, como ya te comentaron, es un concepto algo avanzado y no te enredes con eso. Es bueno saberlo, para que cuando surja la necesidad (casos raros) ,sepas que existe.


Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: pregunta sobre referencia de clases
« Reply #5 on: June 13, 2021, 11:05:04 am »
Gracias por la ayuda a los dos. :D

Hay otra cosa sobre referencia pero con procedimientos y funciones.Lo vi en otro manual pero no funciona y no se porque cuando solo estoy siguiendo los ejemplos.

Manual:
http://docwiki.appmethod.com/appmethod/1.13/topics/en/Anonymous_Methods_in_Object_Pascal

Ejemplo:
Code: Pascal  [Select][+][-]
  1. type
  2.   TSimpleProcedure = reference to procedure;
  3.   TSimpleFunction = reference to function(x: string): Integer;
  4.  
  5. var
  6.   x1: TSimpleProcedure;
  7.   y1: TSimpleFunction;
  8.  
  9. begin
  10.   x1 := procedure
  11.     begin
  12.       Writeln('Hello World');
  13.     end;
  14.   x1;   //invoke anonymous method just defined
  15.  
  16.   y1 := function(x: string): Integer
  17.     begin
  18.       Result := Length(x);
  19.     end;
  20.   Writeln(y1('bar'));
  21. end.
  22.  

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: pregunta sobre referencia de clases
« Reply #6 on: June 13, 2021, 11:48:41 am »
Lo de los métodos anónimos no está implementado aún en Free Pascal, aunque seguramente lo estará pronto (relativamente hablando).
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

zelda16bit

  • Full Member
  • ***
  • Posts: 118
Re: pregunta sobre referencia de clases
« Reply #7 on: June 13, 2021, 05:05:44 pm »
Lo de los métodos anónimos no está implementado aún en Free Pascal, aunque seguramente lo estará pronto (relativamente hablando).

Entonces esperaremos. :)

 

TinyPortal © 2005-2018