Escribe tu búsqueda

Xojo: Métodos y Propiedades Compartidos, y Destructores

Compartir

Hasta ahora hemos visto que los métodos están asociados no tanto a la clase sino a los objetos (instancias) creados a partir de dicha clase. Es decir, en los ejemplos que hemos ido viendo a lo largo de las últimas entregas sólo los Constructores estaban asociados con la clase, en el resto de los casos era preciso crear un objeto primero y, entonces sí, llamar a los métodos desde la variable sobre la que se asignó el objeto en cuestión. Esto mismo es lo que ocurre también con las propiedades, y que hasta el momento sólo hemos tratado como elementos accesibles a través de una instancia.

No obstante, Xojo también nos permite crear un tipo de métodos y propiedades muy especiales. Se trata de los Shared Methods y Shared Properties que, al igual que también encontramos en otros lenguajes de programación orientados a objetos, nos permiten declarar y utilizar tanto métodos como propiedades accesibles a través de la clase propiamente dicha, sin necesidad de que debamos de crear previamente una instancia de objeto.

¿Y qué utilidad tiene esto? Pues bien, cualquier propiedad compartida no sólo estará disponible para la clase y cualquier objeto de la clase, sino que su valor también lo estará. El ejemplo típico sería el de almacenar en una propiedad compartida la cantidad de miembros que se han creado, de modo que dicha información esté disponible para cualquiera de las instancias en cuestión.

En cuanto a los métodos compartidos, éstos nos ahorran en muchas ocasiones la necesidad de tener que generar un objeto temporal o intermedio cuando simplemente buscamos una funcionalidad concreta de la clase. Algunos ejemplos del propio framework de Xojo en los que se utilizan los métodos compartidos son BinaryStream.Open y Picture.Open, entre otros. En definitiva se abstrae el producto (objeto recibido) sobre la implementación de la clase, y de hecho son fundamentales en diseños de software donde se utiliza el patrón de Factoría.

¡Veamos estas dos capacidades en acción!

Usando Propiedades Compartidas

Es el momento de retomar la clase Persona que comenzamos a crear algunas entregas atrás (https://www.faq-mac.com/tutoriales/xojo-clases-objetos/51342), ya que la dotaremos de la capacidad de llevar una cuenta de la cantidad de instancias creadas, propiedad que estará disponible desde cada uno de los objetos.

Para añadir una propiedad compartida a la clase, asegúrate de seleccionar la clase Persona en el Navegador de Proyecto y, a continuación, accede al menú contextual (Ctrl + Clic sobre el icono de la clase) para seleccionar por último Add to “Persona” > Shared Property. Comprobarás como se añade un nuevo apartado en la jerarquía de la clase con la entrada “Shared Properties”. Selecciona la recién creada propiedad compartida contenida en dicha entrada y rellena los campos en el panel Inspector con los siguientes valores:

Name: personasCreadas

Type: Integer

Scope: Protected

Ya sabes que, de este modo, la propiedad combatida en cuestión sólo será visible desde el código de la clase y sus instancias, así como por el código de las clases creadas a partir de ellas (subclases).

Dado que esta propiedad se encargará de llevar la cuenta de las instancias creadas, utilizaremos el constructor de la clase para incrementar su valor. Por tanto, selecciona el método Contructor de la clase Persona y añade el siguiente código al existente en el Editor de Código:

personasCreadas = personasCreadas + 1

También crearemos un nuevo Constructor simple; el utilizado para crear nuevas instancias sin necesidad de proporcionar valores por omisión, y con el único objetivo de que en dicho casos también se contabilice correctamente la propiedad compartida. Para ello, asegúrate de que siga seleccionado el icono de la clase Persona en el Navegador de Proyecto y añade un nuevo método (Insert > Method o bien Comando + Opción + M). Utiliza los siguientes valores en el panel Inspector:

Method Name: Constructor

Scope: Public

E introduce como única línea de código la siguiente:

personasCreadas = personasCreadas + 1

Métodos Compatidos en acción

Ahora es el momento de que añadamos un método compartido a la clase. Su función será muy simple. En realidad se limitará a devolver el valor almacenado por la propiedad compartida dado que esta no es accesible directamente desde el exterior al estar declarada como protegida.

Selecciona nuevamente el icono de la clase Persona y, en esta ocasión, accede al menú contextual haciendo clic sobre su icono para seleccionar la entrada Add to “Persona” > Shared Method. Como ya vimos anteriormente en el caso de las propiedades compartidas, comprobarás que se ha añadido una nueva entrada en la jerarquía de la clase, denominada en esta ocasión “Shared Methods”. Selecciona la entrada recién creada y utiliza los siguientes valores en el panel Inspector:

Method Name: numeroPersonas

Return Type: Integer

Scope: Public

En cuanto al código que has de introducir en el Editor de Código, asociado a dicho método, es el siguiente:

Return personasCreadas

Solo con esto ya disponemos de un método que podemos utilizar desde la clase, sin necesidad de crear un objeto previamente, al igual que también será visible por cualquiera de las instancias de la clase. Esto es algo que comprobaremos mediante el siguiente ejemplo.

Para ver como funciona nuestra propiedad y método compartidos, introduce el siguiente código en el evento Open del objeto Window1 del proyecto:

  dim personas() as Persona

  dim r as new Random

  For n as Integer = 0 to r.InRange( 2,30 )

    personas.append  new Persona

  next

  MsgBox "personas creadas: " + str( Persona.numeroPersonas )  

  dim p as Persona = Personas( r.inrange( 0, personas.Ubound - 1 ) )

  MsgBox str( p.numeroPersonas )

 

De este código, merece la pena destacar tres cosas. La primera de ellas es el uso por primera vez de la clase Random (http://docs.xojo.com/index.php/Random) y, en concreto, el método ‘InRage’ que nos permite obtener un valor aleatorio comprendido en el rango numérico indicado. Esto es lo que utilizamos en el bucle para elegir al azar la cantidad de instancias ‘Persona’ creadas por nuestro programa de ejemplo.

 

El segundo detalle es el que vemos en el primero de los ‘MsgBox’. Aquí llamamos por primera vez al método compartido ‘numeroPersonas’ directamente desde la clase, y obtendremos fielmente la cantidad de instancias ‘Persona’ que se han creado hasta el momento.

 

Por último, en el segundo de los ‘MsgBox’ comprobamos que una instancia Persona elegida previamente al azar de entre las creadas, y referenciadas a través de la variable ‘p’ también muestra correctamente la cantidad de instancias que se han creado. En este caso también utilizando el método compartido ‘numeroPersonas’.

 

En definitiva, tanto el método como la propiedad compartida funcionan perfectamente.

 

Destructores, tareas de limpieza en los objetos

Añade ahora el siguiente código a continuación del existente en el evento Open del objeto Window1:

  personas.remove( Personas.ubound - 1 )  

  MsgBox str(persona.numeroPersonas)

La primera de las líneas se encarga de eliminar el último miembro almacenado en el Array. Como ya sabes, una de las virtudes de Xojo es que la gestión de memoria es automática, lo que significa que en el momento en el que un objeto ya no es referenciado por ninguna variable (incluyendo las propiedades de otros objetos), este deja de existir devolviendo la memoria utilizada al sistema.

Ejecuta el programa y observarás algo desconcertante. ¡Los tres mensajes muestran el mismo número de instancias creadas! Incluso teniendo en cuenta que el último mensaje aparece una vez que se ha eliminado la referencia al último objeto almacenado en el Array y, por tanto, este debería de haber devuelto la memoria al sistema, dejando de existir. ¿Qué ocurre en Xojo? ¿No funciona correctamente?

Lo cierto es que Xojo hace las cosas correctamente, pero nuestro código no o, más concretamente, nuestra variable compartida encargada de llevar la cuenta de instancias creadas y “vivas”.

Como hemos visto, nos encargamos de incrementar el valor de dicha propiedad cada vez que la clase crea una nueva instancia, utilizando para ello los métodos Constructores de la clase; pero, ¿y dónde podemos incluir código para hacer justamente lo opuesto cada vez que se ‘destruya’ el objeto? La respuesta es otro método especial: el Destructor.

El Destructor es el método que, de implementarse en la clase, será llamado automáticamente justo antes de que Xojo devuelva la memoria consumida por el objeto de nuevo al sistema. Esto nos permite realizar las oportunas operaciones de limpieza en nuestro objeto. En el ejemplo concreto que nos ocupa, será el sitio idóneo para restar una unidad a la cantidad de instancias contabilizadas por la clase en su propiedad compartida ‘personasCreadas’. Sería el modo de decirle a la clase: “estoy a punto de desaparecer, ¡bórrame de tu lista!”.

Crear un Destructor es incluso más sencillo que crear un Constructor. De hecho, una clase solo admite un Destructor (no es posible hacer Overload o sobrecarga), y esto se debe a que este método tan particular no admite parámetros ni tampoco tiene la necesidad de devolver ningún tipo de dato.

Añadamos el destructor a nuestra clase Persona. Selecciona su icono en el Navegador de Proyecto y añade un nuevo método. A continuación utiliza los siguientes valores en el panel Inspector:

Method Name: Destructor

Scope: Public

Y con la siguiente línea de código en el Editor de Código correspondiente: 

personasCreadas = personasCreadas - 1

Vuelve a ejecutar de nuevo el programa. En esta ocasión comprobarás que el último MsgBox sí muestra el valor correcto: uno menos.

Por último, a la hora de depurar tus aplicaciones también puedes utilizar el método Destructor en combinación de las propiedades y/o métodos compartidos para asegurarte de que todo esté funcionando correctamente, no haya fugas de memoria, etc. Para ello, puedes emplear las funciones de logado a Consola proporcionadas por Xojo mediante ‘System.Log‘.

Eventos, las respuestas a las acciones

Al igual que puedes añadir métodos y propiedades compartidos a una clase, también es posible utilizar Propiedades Computadas Compartidas. Ya sabes como crearlas y utilizarlas cuando se utilizan desde una instancia de clase. ¿Serías capaz de hacer lo propio sustituyendo el método compartido de nuestro ejemplo por una Propiedad Computada Compartida? Ponlo en práctica.

En la próxima entrega ya entraremos a ver un tipo de métodos muy especiales en Xojo: los eventos y que están directamente relacionados con la interacción por parte de los usuarios sobre nuestros objetos (y por tanto muy relacionados con las clases que producen objetos gráficos para su uso en la interfaz gráfica de nuestras aplicaciones).

Enlaces de Interés sobre Xojo

Artículos anteriores

Javier Rodríguez (@bloguintosh) es desarrollador OS X e iOS, director de Macsoluciones.com. Puedes contactar con él para el desarrollo de aplicaciones para Mac e iOS en entornos empresariales así como consultoría y formación.

Dejar un comentario

Twitter
Visit Us
Tweet
YouTube
Pinterest
LinkedIn
Share