In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Hay alguna diferencia en llamar a una clase de estas maneras?

Foro público de Xailer en español
Responder
Avatar de Usuario
Carlos Ortiz
Mensajes: 872
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Hay alguna diferencia en llamar a una clase de estas maneras?

Mensaje por Carlos Ortiz »

WITH OBJECT oClase := TMiClase( oForm )

ó

WITH OBJECT oClase := TMiClase:New( oForm )

en ambos casos funcionan pero pregunto alguna usa menos recursos? crea menos objetos gdi, DATAS etc etc?

Gracias
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Hay alguna diferencia en llamar a una clase de estas maneras?

Mensaje por ignacio »

Buenos días,

La primera instancia un objeto de clase pero no llama a ningún constructor del mismo, lo cual no suele tener sentido en el 99,99999999% de las veces y a no ser de que se sepa muy bien lo que se está haciendo. Sólamente se hace en casos en los cuales queramos hacer algo sobre el objeto, incluso antes de que se llame a su constructor, pero en cualquier caso, al constructor hay que llamarlo, tarde o temprano.

Saludos

Nota: Por cierto, el parámetro que pasa en la primera construcción no sirve para nada, sin embargo en el segundo caso si, puesto que el constructor New() espera que se le pase como único parámetro su objeto padre
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
Carlos Ortiz
Mensajes: 872
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Re: Hay alguna diferencia en llamar a una clase de estas maneras?

Mensaje por Carlos Ortiz »

Gracias Ignacio!
Manu Exposito
Mensajes: 116
Registrado: Mié Feb 08, 2006 4:41 pm

Re: Hay alguna diferencia en llamar a una clase de estas maneras?

Mensaje por Manu Exposito »

Por filosofar un poco y sin acritud...

Creo que el método "new" mal llamado constructor de las clases de (x)harbour no es necesario si la clase se diseña para que así sea (1).

Hay algunos lenguajes OOP que en vez de tener un método constructor lo que tienen es una función de clase o constructora, ese es el caso de (x)Harbour.

Esa función tiene el mismo nombre que la clase y debuelve un objeto de esa clase pero normalmente sin inicializar. Es para eso para lo que se define un método que inicializa las variables de instancia, atributos, propiedades o datas. A ese método se suele llamar new o start o como a mi me gusta init. Por lo que creo que se le debería llamar más que CONSTRUCTORES INICIALIZADORES. Por cierto, aunque el programador no definan los métodos "init" y "new" estos existirán ya que lo hereda de la clase HbObject de (x)Harbour y que cuando llama a "new" automáticamente se invoca a "init" si existe. Con esto lo que quiero decir es que en la clase se debería implementar el metodo init ya que luego se podrá usar indistintamente oBj:init() o oBj:new() :o
Por cierto la función de clase puede inicializar las datas con la clausula INIT (1)

(1) DATA cNombre INIT "Manu"
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5705
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Hay alguna diferencia en llamar a una clase de estas maneras?

Mensaje por jfgimenez »

Hola Manu,

me gustaría aclarar un par de cosillas:

1) El método Init() NO se llama automáticamente para inicializar ni crear el objeto. Ni Init() ni ningún otro método.
No obstante, sí que hay una cosa en la que tienes toda la razón: si la clase NO tiene método New() y SÍ tiene método Init(), al llamar a TObjeto():New() se llamará internamente a TObjeto():Init(). Pero sinceramente, lejos de verle ninguna ventaja yo lo veo como algo que puede inducir a confusión o error si te equivocas al definir la clase. Además, esto no funcionaría nunca con ninguna clase de Xailer, ya que siempre tenemos el método New() definido.
El tema de las "metaclases" se ha discutido muchas veces, y en varias ocasiones Przemek ha mencionado su intención de hacerlo de forma similar a Class(y), pero nunca se ha abordado porque rompería mucho código que lleva muchos años funcionando.
Por otro lado, Ron Pinkas hizo en su momento un "apaño" en xHarbour, de forma que si se pasaban parámetros a la función de clase, se llamaba automáticamente al método New() pasándole esos parámetros. Pero al final esto mostró más problemas que beneficios, y Harbour nunca llegó a soportarlo.

2) La cláusula INIT de las propiedades funciona como comentas, pero para no confundir a nadie conviene aclarar que sólo se pueden indicar valores "simples" y "constantes", no otras variables, ni llamadas a funciones, ni otras cosas exóticas. Bueno, para ser 100% preciso, no es exactamente así, ya lo sabes, pero para los que no conozcan a fondo el motor de objetos es mejor que lo consideren de esa forma para evitar problemas. En cualquier caso, no se puede usar en la práctica para inicializar propiedades con distintos valores cada vez. P.ej., no serviría para establecer un "oParent" por defecto de un control.
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
Carlos Ortiz
Mensajes: 872
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Re: Hay alguna diferencia en llamar a una clase de estas maneras?

Mensaje por Carlos Ortiz »

Gracias a ambos!
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Hay alguna diferencia en llamar a una clase de estas maneras?

Mensaje por ignacio »

Manu Exposito escribió:Por filosofar un poco y sin acritud...
También, sin acritud. Estoy seguro de que ha Carlos le han quedado clarísimas tus explicaciones. Muchas gracias por tu valiosa aportación.

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder