viernes, 4 de abril de 2014

Receta No. 1-21 en C#: Sobrecargar un Operador

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Ejemplos en Código Fuente C#
4.1 Ejemplo Palabra
4.2 Ejemplo Número Complejo
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

Los lenguajes de programación modernos poseen compiladores más robustos y sofisticados capaces de llevar a cabo operaciones avanzadas sobre las construcciones existentes y sobre las que puede construir el propio programador. El lenguaje de programación C# no se queda atrás en este aspecto, y nos ofrece la posibilidad de manipular las construcciones sintácticas de los operadores estándar (+, -, *, /, entre muchos más como veremos más adelante). ¡Bienvenidos!

1. Problema

Se poseen tipos de datos en el modelo del dominio del problema candidatos para operaciones arbitrarias, y ahora al equipo de programación se le ha solicitado la refactorización de las clases que para actuar de manera arbitraria sobre los operadores estándar del lenguaje de programación C#: +, -, *, &c.

2. Solución

Gracias a que el lenguaje de programación C# permite la sobrecarga de operadores, podemos crear versiones sobrecargadas de los operadores estándar del lenguaje (i.e., +, -, *, !, --, ++, &c.) a través de dos construcciones clave: static y operator (en la siguiente sección hablaremos de esta palabra clave).

3. Discusión de la Solución

Por definición, una clase que sobrecarga un operador estándar (ver Figura 1 [3] de la lista completa de operadores sobrecargables) es requisito indispensable el uso de las siguientes construcciones:
  • static
  • operator [6]
Éste último es una palabra clave (o reservada, como prefieran) que debe especificarse en la firma del método. Así:

public static TipoRetorno operator +(Tipo, Tipo)

Particularizamos, y asumimos que TipoRetorno es string y en código cliente procederíamos de la siguiente manera:

string resultado = objTipo1 + objTipo1;

objTipo1 y objTipo2 son instancias de Tipo.


Por otro lado, la sobrecarga también de un operador está permitida en el ámbito de declaración de una clase de objeto, es decir, vale tener otro método de sobrecarga del operador + con un conjunto de argumentos (tipos y cantidad) diferentes. Veámoslo:

public static TipoRetorno operator +(Tipo, Int)

De este modo podríamos formar una sentencia con la expresión del lado izquierdo, así:

Tipo objTipo4 = objTipo3 + 7;

Como podemos observar en la sentencia anterior, el uso del operador (+) sigue siendo intuitiva y sencilla como lo haríamos con las versiones estándar definidas por la CLR.
Tabla de operadores estándar relacionados con la capacidad de sobrecarga.
Figura 1. Operadores estándar relacionados con la capacidad de sobrecarga.

4. Práctica: Ejemplos en Código Fuente C#

Esta sección  será muy interesante. Estará divida en dos ejemplos de aplicación de operadores sobrecargados para demostrar su utilidad en la composición de estructuras de datos: clases; que requieren sobrecargar cualquiera de los operadores estándar de la especificación del lenguaje de programación C#.

4.1 Ejemplo Palabra

En este primer ejemplo veremos cómo sobrecargar el operador de adición (+) para concatenar dos objetos de la clase Palabra, y, también el texto de una instancia Palabra con un número entero de 32 bits.

Archivo Palabra.cs:
Compilación:


  1. csc /target:exe /out:Palabra.exe Palabra.cs

Ejecución:


  1. ./Palabra.exe

En la salida estándar obtendremos el siguiente resultado:
Prueba de ejecución de Palabra.exe
Figura 2. Prueba de ejecución de Palabra.exe.


4.2 Ejemplo Números Complejos

En este siguiente ejemplo veremos cómo podemos crear una clase para representar números complejos. La nueva clase con operadores sobrecargados tendrá la capacidad de adicionar, substraer, multiplicar números complejos.

Archivo NumeroComplejo.cs:



Compilación:

  1. csc /target:exe /out:NumeroComplejo.exe NumeroComplejo.cs

Ejecución:


  1. ./NumeroComplejo.exe

> Prueba de ejecución.

[Nota: En [5] y en [7] podrán encontrar otras descripción y ejemplos interesantes para ir más a fondo de este tópico.]

Conclusiones

A lo largo de todo este artículo aprendimos cómo sobrecargar operadores a través de la descripción y uso sintáctico, y el reconocimiento de una nueva palabra clave (o reservada): operator. Luego a través de ejemplos prácticos, vimos su uso concreto en dos clases: Palabra, y NumeroComplejo. Este es el poder y flexibilidad expresiva del lenguaje de programación que otorga al programador de una herramienta para cumplir objetivos de desarrollo específicos.

Glosario

  • CLR
  • Construcción
  • Estándar
  • Lenguaje
  • Operador
  • Refactorización
  • Sobrecarga

Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[3]: Overloadable Operators (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/8edha89s.aspx
[4]: .net# operator overload for "+="? - Stack Overflow - http://stackoverflow.com/questions/6587107/c-sharp-operator-overload-for
[5]: C# Operator Overloading - http://www.dotnetperls.com/operator



M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.