Forum > Spanish

pregunta sobre referencia de clases

(1/2) > >>

zelda16bit:
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:
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  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---    TMyClass = class(TComponent)  //Define clase    //Definir campos  end; var  C: TMyClass;  //Declarar variablebegin  C := TMyClass.Create(nil);   //Crea objeto  //Hace algo   FreeAndNil(C);  //Destruye objeto  ... 
Lo que te está indicando es que,  además puedes hacer:


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---var  C: TMyClass;  ClassRef: class of TMyClass;  //Referencia a clasebegin  ClassRef := TMyClass;   //Define la clase a la que apunta ClassRef  C := ClassRef.Create(nil);   //Crea el objeto de forma normal  //Hace algo  FreeAndNil(C);   //Lo destruye  ... 
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.

zelda16bit:
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:
Obviamente no soy Edosn ;) pero ...

--- Quote from: zelda16bit on June 12, 2021, 11:25:09 pm ----¿Porque estas heredando de TComponent?
-¿Porque al crear el objeto le pones (nil)?
--- End quote ---

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  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---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.
--- End quote ---
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 ;)

Edson:
Ya @lucamar respondió muy bien, a pesar de no ser yo. Pero igual te respondo por si te sirve.


--- Quote from: zelda16bit on June 12, 2021, 11:25:09 pm ----¿Porque estas heredando de TComponent?

--- End quote ---

Porque estoy usando el mismo código del ejemplo.


--- Quote from: zelda16bit on June 12, 2021, 11:25:09 pm ----¿Porque al crear el objeto le pones (nil)?

--- End quote ---

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.


--- Quote from: zelda16bit on June 12, 2021, 11:25:09 pm ----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)?

--- End quote ---

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.


Navigation

[0] Message Index

[#] Next page

Go to full version