Sobrecarga de operadores (C# y Java)

Actualización: noviembre 2007

Al igual que C++, C# permite sobrecargar operadores para utilizarlos en clases propias. Esto hace posible que utilizar un tipo de datos definido por el usuario parezca tan natural y lógico como utilizar un tipo de datos fundamental. Por ejemplo, podría crear un nuevo tipo de datos denominado ComplexNumber para representar un número complejo y proporcionar métodos que realicen operaciones matemáticas en esos números mediante operadores aritméticos estándar, como utilizar el operador + para sumar dos números complejos.

Para sobrecargar un operador, se escribe una función que tenga el nombre del operador seguido del símbolo del operador que se va a sobrecargar. Por ejemplo, a continuación se muestra cómo sobrecargar el operador +:

public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)

Todas las sobrecargas de operador son métodos estáticos de la clase. También tenga en cuenta que si sobrecarga el operador de igualdad (==), también debe sobrecargar el operador de desigualdad (!=). Los operadores < y >, y los operadores < = y > = también se deberían sobrecargar en pares.

La lista completa de operadores que se pueden sobrecargar es la siguiente:

  • Operadores unarios: +, -, !, ~, ++, --, true, false

  • Operadores binarios: +, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=

El ejemplo de código siguiente crea una clase ComplexNumber que sobrecarga los operadores + y -:

public class ComplexNumber
{
    private int real;
    private int imaginary;

    public ComplexNumber() : this(0, 0)  // constructor
    {
    }

    public ComplexNumber(int r, int i)  // constructor
    {
        real = r;
        imaginary = i;
    }

    // Override ToString() to display a complex number in the traditional format:
    public override string ToString()
    {
        return(System.String.Format("{0} + {1}i", real, imaginary));
    }

    // Overloading '+' operator:
    public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)
    {
        return new ComplexNumber(a.real + b.real, a.imaginary + b.imaginary);
    }

    // Overloading '-' operator:
    public static ComplexNumber operator-(ComplexNumber a, ComplexNumber b)
    {
        return new ComplexNumber(a.real - b.real, a.imaginary - b.imaginary);
    }
}

Esta clase permite crear y manipular dos números complejos con código de la manera siguiente:

class TestComplexNumber
{
    static void Main()
    {
        ComplexNumber a = new ComplexNumber(10, 12);
        ComplexNumber b = new ComplexNumber(8, 9);

        System.Console.WriteLine("Complex Number a = {0}", a.ToString());
        System.Console.WriteLine("Complex Number b = {0}", b.ToString());

        ComplexNumber sum = a + b;
        System.Console.WriteLine("Complex Number sum = {0}", sum.ToString());

        ComplexNumber difference = a - b;
        System.Console.WriteLine("Complex Number difference = {0}", difference.ToString());
    }
}

Como se muestra en el programa, los operadores más y menos se pueden utilizar ahora casi intuitivamente en objetos que pertenecen a la clase ComplexNumber. Éste es el resultado que se obtendría:

Complex Number a = 10 + 12i

Complex Number b = 8 + 9i

Complex Number sum = 18 + 21i

Complex Number difference = 2 + 3i

Java no admite la sobrecarga de operadores, aunque internamente sobrecarga el operador + para la concatenación de cadenas.

Vea también

Tareas

Ejemplo Operator Overloading

Conceptos

Guía de programación de C#

Referencia

Operadores sobrecargables (Guía de programación de C#)

Otros recursos

Lenguaje de programación C# para desarrolladores de Java