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
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.
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?
- Carlos Ortiz
- Mensajes: 872
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
- 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?
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
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
- 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?
Gracias Ignacio!
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar
-
- Mensajes: 116
- Registrado: Mié Feb 08, 2006 4:41 pm
Re: Hay alguna diferencia en llamar a una clase de estas maneras?
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()
Por cierto la función de clase puede inicializar las datas con la clausula INIT (1)
(1) DATA cNombre INIT "Manu"
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()
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?
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.
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.
- 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?
Gracias a ambos!
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar
- 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?
También, sin acritud. Estoy seguro de que ha Carlos le han quedado clarísimas tus explicaciones. Muchas gracias por tu valiosa aportación.Manu Exposito escribió:Por filosofar un poco y sin acritud...
Un saludo