Escribe tu búsqueda

Extensiones de clase en Xojo

Compartir

A estas alturas deberíamos de tener muy claro qué son las clases, cómo podemos dotarlas de estado (propiedades) y también cómo podemos modificar dicho estado o ejecutar acciones (métodos y también propiedades computadas).

De igual modo, también sabemos que no sólo podemos crear nuestras clases desde cero, sino que Xojo incluye de serie en su Framework una gran cantidad de clases listas para usar, a partir de las cuales podemos crear los objetos que necesitemos, incluyendo elementos gráficos como ventanas, botones, listas, campos de texto, imágenes, y un largo etcétera.

Por otra parte, también hemos aprendido que el modo en el que podemos añadir una funcionalidad especializada a una clase es a través de las subclases; es decir, una nueva clase hija que hereda todas las propiedades y métodos de aquella clase a partir de la cual se crea.

Sin embargo, la creación de una subclase no siempre es la mejor herramienta con la que contamos. El lenguaje nos proporciona una alternativa que en muchas ocasiones resulta más cómoda y evita la necesidad de engordar el proyecto o las jerarquías de clases mediante la creación de nuevas subclases. Se trata de la extensión de clase.

Las extensiones de clase son la herramienta perfecta para aquellos casos en los que te encuentras diciéndote a ti mismo: “sería perfecto si esta clase contase con un método para hacer esta u otra cosa”, ya sea porque no está contemplado de base o bien porque sí es posible pero, para ello, nos vemos obligados a realizar varios pasos.

Mediante las extensiones de clase lo que hacemos es asociar la definición y código de un método a una clase ya existente, de modo que posteriormente podremos invocar dicho método como si formase parte realmente de la clase en cuestión.

Ahora bien, si tal y como sabemos hasta ahora los métodos han de definirse en clases ya existentes… ¿dónde podemos escribir dichos métodos que actuarán como extensiones de clase?

Módulos: crea tus propias librerías

Los módulos son los elementos de Xojo que se pueden utilizar para contener prácticamente cualquier elemento de proyecto que, por cualquier motivo, deseemos conservar bajo su propio nombre de espacio: clases, propiedades, métodos, constantes… Eso sí, si bien es posible definir la visibilidad de cada uno de estos elementos, gran parte de su potencia y flexibilidad radica en el hecho de que sus contenidos son globales y, por tanto, accesibles desde cualquier objeto de nuestro proyecto (algo, por otra parte, nada bueno desde la perspectiva de la programación orientada a objetos).

¿Y a qué nos referimos con eso de nombre de espacio? Como sabes hasta ahora, cuando accedes a un método o propiedad de una clase lo haces anteponiendo previamente el nombre del objeto o clase en cuestión. Por ejemplo en:

    dim s as string = "esto es una cadena"
    dim i as integer = s.len()

En este caso, bajo la notación por punto, la variable ‘s’ será el nombre de espacio sobre el que se invocará el método ‘len’ común a todos los objetos de tipo String.

Sin embargo, imaginemos que en nuestro módulo definimos un método global len(). ¿Cómo podría saber el compilador cuál de ellos ha de ejecutar? ¿El método correspondiente al tipo de dato String o el definido en nuestro módulo? La respuesta: los nombres de espacio y que, en el caso de los módulos, se traduce en el nombre que asignemos al módulo propiamente dicho sobre su creación. Así, por ejemplo en:

    Dim s as string = "esto es una cadena"
    dim i as integer = s.len()
    dim n as integer = miModulo.len()

El compilador sabrá perfectamente qué ha de hacer el método ‘len()’ en cada caso. De hecho, los nombres de espacio no son una herramienta exclusiva de Xojo sino que también se utilizan de forma frecuente en otros lenguajes de programación para evitar conflictos o, como se suele decir, colisiones.

Definir una extensión de método en un módulo

Volvamos al tema que nos ocupa. Ya sabemos que podemos realizar la definición de métodos globales en un módulo, y el modo de crear uno es desde Insert > Module

Añadir módulo a proyecto Xojo

 

A continuación utilizaremos el panel Inspector para asignar el nombre del módulo (y que utilizaremos posteriormente como nombre de espacio). Una vez que se ha añadido a la barra lateral del proyecto, ya podemos seleccionarlo y utilizar el menú contextual o bien el menú Insert para añadir un nuevo método global.

Un consejo: cuando añadas a un módulo un nuevo método que vayas a utilizar como extensión de clase, procura que el nombre asignado al método tenga todo el sentido como parte de la clase en la que se vaya a utilizar. Aquí utilizaremos como ejemplo ‘withoutVowels’ para añadir un nuevo método a la clase String que nos devuelva la cadena sin vocales.

Signatura de método extendido

La magia para que Xojo interprete el método como extensión de una clase consiste en utilizar la palabra clave extends como primer elemento en el campo de parámetros, utilizando a continuación el objeto y el tipo de objeto sobre cuya clase se aplicará el método en cuestión.

Así, en nuestro ejemplo, la variable ‘s’ será la que contenga el objeto sobre el que se invocará el método, y cuyo tipo definimos a continuación.

Dado que en este caso estamos interesados en obtener un resultado, no olvidaremos introducir el tipo devuelto en el campo Return Type, tal y como haríamos con cualquier otro método.

En el Editor de Código correspondiente a nuestro nuevo método, incluye lo siguiente:  
    dim temp, e as string
    for n as integer = 0 to s.len
        e = mid(s,n,1)
        if e <> "a" and e <> "e" and e <> "i" and e <> "o"and e <> "u" then
            temp = temp + e
        end
    next
    Return temp

Como puedes ver se trata de una versión simplificada donde se devuelve la misma cadena de texto sin vocales (aunque no se contemplan las acentuadas. ¡Prueba a incluir dicha capacidad!)

Ahora añade el evento Open en el objeto Window1 del proyecto (consulta la última entrega sobre Eventos), e incluye el siguiente código sobre dicho evento:

    Dim s as string = "esta es una prueba"
    MsgBox s.WithoutVowels

Cuando lo hagas observarás que ‘WithoutVowels’ pasa a formar parte de las sugerencias por autocompletado proporcionadas por el IDE de Xojo para la clase String (la variable ‘s’ está definida como tipo string después de todo), de modo que es una certeza de que nuestra extensión de clase funciona como tal.

Resultado de la extensión de método para String

Ejecuta el programa y observa el resultado, ya tienes una versión reducida de tu propio “cifrador para mensajes SMS”.

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