Page 1 of 1

Antonio. Sobre el nombre de las Clases

Posted: Thu Oct 20, 2005 12:20 pm
by miarcod
Hola:

El problema que tengo es que si creo una clase heredando de otra ( lo estoy haciendo con btnbmp) el comportamiento de esta clase no es el mismo que el de la clase original.

Esto es debido en que algunas partes del codigo de las clases de Fivewin se controla el nombre de la clase para actuar de una u otra forma.

Creo que este comportaiento no debería depender del nombre de la clase sinó de algún otro dato que tuviese la clase, porque sino una simple modificación de una clase me obliga a modificar la clase principal window y también creo que la clase control.

Yo sólo quiero crear una clase nueva igual que la otra pero con otro nombre, en la que le agregaré una serie de datos adicionales para modificar su comportamiento.

Bueno, ahora la pregunta.

Si tengo el siguiente codigo

Code: Select all

CLASS MiBtn FROM TBNTBMP
.....
ENDCLASS

// redefino los métodos constructores para que se ejecuten los metodos del padre

O := MiBtn():New()
o:lCancel := .T.
Pues la clausula cancel no funciona

Como puedo solucionar esto sin tener que modificar la clase WINDOW, control, ... no se cuales más tendría que modificar.
¿Es posible cambiar el nombre de una clase para que tenga uno distinto al que se usó para crearla?

Posted: Thu Oct 20, 2005 3:39 pm
by Antonio Linares
Tienes toda la razón. Los nombres de las Clases no deberían usarse directamente en determinadas clases, sino usar el método que comprueba si una determinada clase es igual ó deriva de otra.

Puedes cambiar el nombre de la clase, pero busca en los PRGs donde se está usando el nombre de esa clase, y añade el tuyo tambien.

Posted: Thu Oct 20, 2005 8:25 pm
by miarcod
Gracias Antonio,

pero hay alguna forma para que pueda cambiar el nombre de la clase

Lo que pretendo es no tener que modificar las clases padres.


Te explico el porqué

Cuando empece a desarrollar con fivewin me encontré en la necesidad de modificar algunas clases para adaptarlas al funcionamiento que quería. El resultado final es el que yo deseaba, pero al cabo de un poco de tiempo decidí actualizar la versión de fivewin y el resultado fué que tuve que volver a modificar mis clases para poder usar las modificaciones que se se habían realizado en algunas de ellas (yo ignoraba e ignoro cuales fueron modificadas). Entonces decidí que no actualizaria la librería porque los problemas que me originaba no me conpensaba y mientras no necesitara otra cosa pues a aguantarse. Hace aproximadadamente un año decidí volver a actualizar y me volvió a pasar lo mismo, el caso es que se me hace bastante complicado el mantenimiento de las clases modificadas.

Como lo resuelvo, bueno pues decido no usar las clases que modifico y en su lugar usar clases heredadas de las originales pero con una serie de comportamientos especificos, reprogramo los metodos que me interesan y el resto los dejo. Al final obtengo una clase con cuatro o cinco métodos modificados que me es muy facil de mantener, pero

Si modifico la clase, por ejemplo Window, y actualizo la libreria no solo tengo que preocuparme de _ que afecten a las clases que yo he modificado sinoo de otras que no cambié.

Un saludo y gracias de nuevo

Posted: Fri Oct 21, 2005 10:14 am
by Juan Gálvez
Quizás pueda servir algo así :

Code: Select all

CLASS MiBtn FROM TBNTBMP 
.....
   METHOD ClassName() INLINE "TBTNBMP"
..... 
ENDCLASS
Saludos

Posted: Fri Oct 21, 2005 7:30 pm
by miarcod
Gracias funcionó.

Pero supongo que el nombre de la clase estará registrado en alguna parte de esta, pero no encuentro el data ni el método ClassName definido dentro de la clase.

He rebuscado en Windows y Control, pero no lo encuentro, espero que no me cause futuros problemas.

Un saludo
:shock:

Posted: Fri Oct 21, 2005 10:03 pm
by Antonio Linares
Harbour/xHarbour registran automaticamente el nombre de la clase desde la línea CLASS ...

la Clase HBObject de [x]Harbour implementa esos métodos y todas las clases heredan automaticamente de ella. Puedes revisar dicha clase en Harbour/source/rtl/tobject.prg.