Sobrecarga de operadores en Xojo

Todos estamos habituados a utilizar los operadores en Xojo, ¿verdad? Después de todo, son los que nos permiten realizar todo tipo de operaciones matemáticas con absoluta comodidad, además de utilizarlos también para la concatenación de cadenas (Strings), en este caso mediante el signo propio de la suma (+).

Ahora bien, ¿no sería fantástico disponer de la flexibilidad de sintáxis que supone si pudiésemos aplicar dichos operadores también en nuestras propias clases? Bueno, lo cierto es que ¡sí se puede! Y esa es una gran noticia, pues nos permite simplificar y potenciar nuestro código en una gran medida. De hecho, este es uno de los temas que puedes ver tratado y explicado en el libro, de modo que también te resulte más fácil de digerir todos los conceptos y el resto de lo que rodea a la programación en general y la programación orientada a objetos con Xojo en particular.

Lo que veremos aquí es un ejemplo práctico sobre el uso que podemos dar a la sobrecarga de operadores sobre una clase propia. Para ello, definiremos una nueva clase (tipo de dato) que actuará como una colección de enteros. En realidad, podría decirse que se trata simplemente de un envoltorio o wrapper en torno a un Array de enteros. El esquema UML de dicha clase sería el siguiente:

Como puedes ver, la clase MyCollection está compuesta por dos constructores. El primero de ellos es el estándar, y que nos permite instanciar un nuevo objeto sin necesidad de que debamos de pasar un parámetro tal y como exige el segundo de los constructores utilizados, y que es el designado como constructor de conveniencia. Su código no puede ser más sencillo:

stack = source

Aparte de los constructores, la clase no tiene más que una propiedad de tipo Array encargada de contener números enteros.

Así, con las siguientes líneas de código ya podríamos crear nuevas instancias (objetos) a partir de la plantilla que supone la recién creada clase ‘MyCollection’:

dim c1 as MyCollection = new MyCollection
dim c2 as MyCollection = new MyCollection( Array(1, 2, 3, 4, 5) )

En el primer caso se utiliza con la variable c1 el constructor por omisión, mientras que con la segunda inicialización de la variable c2 se usa el constructor de conveniencia encargado de asignar el array recibido a la propiedad de la clase.

Operator_Add

¿Cómo podríamos sumar ambas colecciones de modo que los elementos de una o varias de dichas colecciones pasaran a formar parte de la colección de destino? ¡Mediante la suma, claro está! Para ello, el lenguaje de programación Xojo nos permite sobrecargar dicho operador mediante la signatura de función Operator_Add, teniendo en cuenta que ha de recibir un parámetro del mismo tipo y devolver una nueva instancia con el resultado de la operación, también del mismo tipo.

En el caso de nuestra clase MyCollection, la signatura para la sobrecarga del operador Operator_Add sería la siguiente:

Operator_Add( source as MyCollection) as MyCollection

Y el código utilizado por dicha función, sería el siguiente:

for each item as integer in source.stack
self.stack.Append item
next

Return new MyCollection(self.stack)

Sencillo, ¿verdad?

Ahora, armados con nuestro nuevo operador de suma recién sobrecargado, ya podemos utilizarlo para sumar los valores de dos o más colecciones tal y como se muestra en el siguiente código:

dim c1 as MyCollection = New MyCollection( Array(1, 2, 3, 4, 5) )
dim c2 as MyCollection = New MyCollection( Array(6, 7, 8, 9, 10) )

c1 = c1 + c2

//los contenidos de la variable c1 pasan a ser -> (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Lo mejor es que podemos concatenar la suma de varios objetos del mismo tipo, al tiempo que este tipo de sintáxis proporciona una mayor claridad sobre la intención del código en comparación a otras alternativas.

dim c3 as MyCollection = New MyCollection( Array(11, 12, 13, 14, 15) )

c1 = c1 + c2 + c3

Otros operadores

Como puedes comprobar en la documentación de Xojo, existen muchos otros operadores que puedes sobrecargar en tus propias clases o bien en las clases derivadas de cualquiera de las que suponen el framework de Xojo. Ahora solo es cuestión de imaginación y que lo pongas en práctica para mejorar tu código Xojo.

Si lo deseas, puedes descargar el código de ejemplo desde este enlace, en el que también se añade la sobrecarga del operador correspondiente a la sustracción.

También puedes descargar este artículo ampliado en formato PDF desde este enlace o bien en formato iBooks desde otro enlace para leerlo con tu iPad, iPhone o iPod touch, o bien desde la aplicación del mismo nombre en OS X

¡Espero tus comentarios!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *