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.