6 de julio de 2016

El huevo o la gallina, ¿Propiedades o métodos?

Artículo original: Egg or Chicken, Properties or Methods?
http://www.foxpert.com/knowlbits_200701_6.htm
Autor: Christof Wollenhaupt
Traducido por: Ana María Bisbé York


En Visual FoxPro se pueden utilizar expresiones para iniciar propiedades. Estas expresiones son evaluadas una vez que carga la primera vez la clase en la memoria. El resultado se guarda en el objeto de clase. Para crear una expresión para una propiedad, puede, o entrar el signo igual en la ventana Propiedades seguido por la expresión, o presionar el botón "fx" que está junto al botón Zoom, en la ventana Propiedades.

He mostrado en varias ocasiones que estas expresiones pueden incluir THIS. La referencia apunta al objeto clase, no al objeto que está creando. De hecho, THIS ni siquiera apunta a un objeto de la misma clase. Si solamente accede a las propiedades del objeto clase, no notará la diferencia.

No obstante, si intenta llamar a un método debe tener en cuenta que las propiedades son evaluadas antes que los métodos. ¿Esto qué significa? Cree una clase "Level1" basada en Form y guárdela en Level1.VCX. Agregue el método "CallMethod" con el siguiente código:

Activate Screen
? "Llamada ", This.Class

Ahora, añada la propiedad nTest y asigne la siguiente expresión:

=This.CallMethod()*2

En la ventana de comandos escriba:

Clear All
Release All
Clear
ox = NewObject("Level1","Level1")
? ox.nTest

Notará dos cosas. La pantalla está vacía y nTest es .F., no 2. La razón para esto es que, en el momento en que es evaluada la expresión, aún no ha sido adjuntado el código al método. CallMethod existe; pero está vacío. Ahora, permítame avanzar a un punto superior. Crear un programa ShowInfo.prg con el siguiente contenido

Lparameters toRef
? toRef.Class
toRef.CallMethod()
Return 1

Cree una nueva clase Level2 que hereda de Level1. Almacene la nueva clase en Level2.vcx. Sobreescriba CallMethod con este código:

Activate Screen
? "Subclase llamada ", This.Class

Ahora active la ventana Comandos y escriba:

Clear All
Release All
Clear
ox = NewObject("Level2","Level2")

Esta vez puede ver la siguiente salida:

Level2
Called Level2

Cuando se carga la clase, ya está claramente llamado el método ShowInfo. La llamada del método también trabaja, al menos en alguna medida. En lugar de ejecutar el código en la clase Level2, ahora ejecuta el código desde la clase Level,1 que no ha sido ejecutada cuando se instancia el Level1.

Lo que ocurre es que cuando instancie Level2, Visual FoxPro, crea primeramente un objeto para Level1. Esto ocurre en dos pasos. Primero, son evaluadas todas las propiedades. Luego, se añaden todos los métodos. Como se ha pedido Level2, Visual FoxPro, crea luego el objeto para Level2. VFP crea una copia para la clase Level1 incluyendo el código del método. Como antes, las propiedades se evalúan primero. En este momento, CallMethod combina aun el código que ha sido copiado desde la clase de Level1.

Únicamente después de que todas las propiedades hayan sido evaluadas, Visual FoxPro agrega los códigos de los métodos a la clase Level2. Si crea una variable pública en ShowInfo.prg y guarda toRef en esa variable, obtiene una referencia a la clase. Cuando ejecuta CallMethod() en este objeto global  después de crear una instancia, obtiene además el código de la subclase.

Por tanto, recuerde: Las propiedades existen antes de que existan los métodos. Si no desea crear estas clases por si mismo, las puede descargar desde aquí:

http://www.foxpert.com/files/EggOrChicken.zip

No hay comentarios. :

Publicar un comentario