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
User avatar
Carlos Ortiz
Posts: 846
Joined: Wed Jul 01, 2009 5:44 pm
Location: Argentina - Córdoba
Contact:

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

Postby Carlos Ortiz » Tue Jun 28, 2016 6:51 am

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
@dbfarma
www.dbfarma.com.ar
User avatar
ignacio
Site Admin
Posts: 8574
Joined: Mon Apr 06, 2015 8:00 pm
Location: Madrid, Spain
Contact:

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

Postby ignacio » Tue Jun 28, 2016 10:12 am

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]
http://www.xailer.com
http://www.xailer.info
User avatar
Carlos Ortiz
Posts: 846
Joined: Wed Jul 01, 2009 5:44 pm
Location: Argentina - Córdoba
Contact:

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

Postby Carlos Ortiz » Wed Jun 29, 2016 12:31 am

Gracias Ignacio!
@dbfarma
www.dbfarma.com.ar
Manu Exposito
Posts: 110
Joined: Wed Feb 08, 2006 4:41 pm

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

Postby Manu Exposito » Sun Jul 03, 2016 5:21 pm

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"
User avatar
jfgimenez
Site Admin
Posts: 5620
Joined: Mon Apr 06, 2015 8:48 pm
Contact:

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

Postby jfgimenez » Sun Jul 03, 2016 10:02 pm

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
User avatar
Carlos Ortiz
Posts: 846
Joined: Wed Jul 01, 2009 5:44 pm
Location: Argentina - Córdoba
Contact:

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

Postby Carlos Ortiz » Tue Jul 05, 2016 6:05 am

Gracias a ambos!
@dbfarma
www.dbfarma.com.ar
User avatar
ignacio
Site Admin
Posts: 8574
Joined: Mon Apr 06, 2015 8:00 pm
Location: Madrid, Spain
Contact:

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

Postby ignacio » Tue Jul 05, 2016 4:49 pm

Manu Exposito wrote: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]
http://www.xailer.com
http://www.xailer.info

Return to “Spanish”