Página 1 de 1

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

Publicado: Mar Jun 28, 2016 6:51 am
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

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

Publicado: Mar Jun 28, 2016 10:12 am
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

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

Publicado: Mié Jun 29, 2016 12:31 am
por Carlos Ortiz
Gracias Ignacio!

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

Publicado: Dom Jul 03, 2016 5:21 pm
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"

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

Publicado: Dom Jul 03, 2016 10:02 pm
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.

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

Publicado: Mar Jul 05, 2016 6:05 am
por Carlos Ortiz
Gracias a ambos!

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

Publicado: Mar Jul 05, 2016 4:49 pm
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