Cómo trabajar con la sobrecarga del operador en C #

El polimorfismo es uno de los principios básicos de la programación orientada a objetos (POO). La palabra polimorfismo se deriva de dos palabras: "poli", que significa muchas, y "morph", que significa formas. Por tanto, el polimorfismo implica la existencia de la misma cosa pero en diferentes formas.

La sobrecarga del operador es un ejemplo de polimorfismo estático. Puede aprovechar la sobrecarga de operadores o agregar funcionalidad a los operadores para trabajar con tipos definidos por el usuario de la misma manera que trabaja con tipos de datos fundamentales.

¿Cuáles son los operadores y cuáles son los operadores que pueden sobrecargarse?

En una expresión, normalmente tiene operadores y operandos. Los operadores son aquellos que trabajan con operandos y todos forman parte de una expresión. Como ejemplo, la siguiente es una expresión que contiene dos operandos y un operador. Los operandos son X e Y y el operador es +.

X + Y

Los operadores se clasifican en unario, binario, comparación, asignación, etc. dependiendo de su propósito y del número de operandos en los que trabajarían los operadores. Aunque la mayoría de los operadores pueden estar sobrecargados, se aplican ciertas restricciones. En esencia, no todos los operadores pueden estar sobrecargados.

Los operadores unarios, es decir, los operadores que trabajan con un operando pueden estar sobrecargados. También puede sobrecargar operadores binarios y operadores de comparación como, ==,! =,, =. Sin embargo, no puede sobrecargar los operadores =,?, ->, new, is, sizeof o typeof. Tampoco puede sobrecargar los operadores condicionales como && y || fácilmente. Además, el operador de indexación de matriz [] no se puede sobrecargar.

Puede obtener más información sobre lo que pueden sobrecargar todos los operadores en este artículo de MSDN.

Implementar la sobrecarga del operador en C #

En esta sección, exploraremos cómo podemos implementar la sobrecarga de operadores en C #. Considere la siguiente clase llamada DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

   }

Consulte la lista de códigos anterior. La clase DistanceCalculator contiene dos miembros de datos de tipo Int32, a saber, pies y pulgadas. Ahora agregaríamos más métodos a esta clase para ilustrar cómo se pueden sobrecargar los operadores.

Cuando trabaje con el operador sobrecargado, debe tener en cuenta ciertos puntos. El operador que se va a sobrecargar debe tener un método correspondiente marcado con la palabra clave operator. Los argumentos de la función del operador son operandos y su función del operador puede devolver un valor. La función del operador debe ser estática y debe ser miembro del tipo contenedor.

El siguiente fragmento de código ilustra cómo se vería una función de operador típica. Este ejemplo muestra cómo se pueden sobrecargar los operadores == y! =.

public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

Tenga en cuenta que Valor es una propiedad que devuelve el valor en términos de pulgadas.

public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

Aquí está la lista completa de códigos de la clase DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

       public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

       public override bool Equals(object obj)

       {

           DistanceCalculator distanceCalculator = obj as DistanceCalculator;

           if (distanceCalculator != null)

           {

               return (distanceCalculator == this);

           }

           return false;

       }

       public override int GetHashCode()

       {

           return Value.GetHashCode();

       }

     public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

       public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

   }

El siguiente fragmento de código ilustra cómo puede utilizar la clase DistanceCalculator.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 2);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

           Console.WriteLine((obj1 == obj2).ToString());

           Console.Read();

       }

El siguiente fragmento de código muestra cómo puede sobrecargar el operador + para agregar dos objetos.

public static DistanceCalculator operator +(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           Int32 totalInches = obj1.Value + obj2.Value;

           Int32 feet = totalInches / 12;

           Int32 inch = totalInches % 12;

           DistanceCalculator temp = new DistanceCalculator(feet, inch);

           return temp;

       }

Agreguemos las siguientes dos propiedades a la clase DistanceCalculator. El siguiente fragmento de código muestra cómo puede agregar dos objetos de tipo DistanceCalculator y devolver el objeto resultante como del mismo tipo, es decir, el objeto devuelto es de tipo DistanceCalculator.

public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

A continuación, se explica cómo puede crear dos instancias de la clase DistanceCalculator y aprovechar la función de operador sobrecargada para asignar el resultado en otro objeto del mismo tipo.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 11);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

           DistanceCalculator obj3 = obj1 + obj2;

           Console.WriteLine("Feet: "+obj3.Feet.ToString());

           Console.WriteLine("Inch: " + obj3.Inch.ToString());

           Console.Read();

       }