C# Sobrecarga de operadores
Puede redefinir o sobrecargar los operadores integrados en C#. Por lo tanto, los programadores también pueden usar operadores de tipos definidos por el usuario. Un operador sobrecargado es una función con un nombre especial, que se define mediante la palabra claveoperatorseguida del símbolo del operador. Igual que otras funciones, los operadores sobrecargados tienen un tipo de retorno y una lista de parámetros.
Por ejemplo, observe la siguiente función:
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
La función anterior implementa el operador de suma (+) para la clase Box definida por el usuario. Suma las propiedades de dos objetos Box y devuelve el objeto Box resultante.
Implementación de la sobrecarga de operadores
El siguiente programa demuestra la implementación completa:
Ejemplo
namespace OperatorOvlApplication
{
class Box
{
private double length; // Longitud
private double breadth; // Ancho
private double height; // Altura
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// Sobrecargar el operador + para sumar dos objetos Box
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
}
class Tester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Declarar Box1, de tipo Box
Box Box2 = new Box(); // Declarar Box2, de tipo Box
Box Box3 = new Box(); // Declarar Box3, de tipo Box
double volume = 0.0; // Volumen
// Detalles de Box1
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Detalles de Box2
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// Volumen de Box1
volume = Box1.getVolume();
Console.WriteLine("Volumen de Box1: {0}", volume);
// Volumen de Box2
volume = Box2.getVolume();
Console.WriteLine("Volumen de Box2: {0}", volume);
// Sumar los dos objetos
Box3 = Box1 + Box2;
// Volumen de Box3
volume = Box3.getVolume();
Console.WriteLine("Volumen de Box3: {0}", volume);
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Box1 的体积: 210 Box2 的体积: 1560 Box3 的体积: 5400
Operadores sobrecargables y no sobrecargables
La siguiente tabla describe la capacidad de sobrecarga de operadores en C#:
| Operador | Descripción |
|---|---|
| +, -, !, ~, ++, -- | Estos operadores unarios tienen un solo operando y pueden sobrecargarse. |
| +, -, *, /, % | Estos operadores binarios tienen dos operandos y pueden sobrecargarse. |
| ==, !=, <, >, <=, >= | Estos operadores de comparación pueden sobrecargarse. |
| &&, || | Estos operadores lógicos condicionales no pueden sobrecargarse directamente. |
| +=, -=, *=, /=, %= | Estos operadores de asignación no pueden sobrecargarse. |
| =, ., ?:, ->, new, is, sizeof, typeof | Estos operadores no pueden sobrecargarse. |
Ejemplo
Con base en la discusión anterior, ampliemos el ejemplo anterior sobrecargando más operadores:
Ejemplo
namespace OperatorOvlApplication
{
class Box
{
private double length; // Longitud
private double breadth; // Ancho
private double height; // Altura
public double getVolume()
{
return length * breadth * height;
}
public void setLength( double len )
{
length = len;
}
public void setBreadth( double bre )
{
breadth = bre;
}
public void setHeight( double hei )
{
height = hei;
}
// Sobrecargar el operador + para sumar dos objetos Box
public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}
public static bool operator == (Box lhs, Box rhs)
{
bool status = false;
if (lhs.length == rhs.length && lhs.height == rhs.height
&& lhs.breadth == rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator !=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length != rhs.length || lhs.height != rhs.height
|| lhs.breadth != rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator <(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length < rhs.length && lhs.height
< rhs.height && lhs.breadth < rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length > rhs.length && lhs.height
> rhs.height && lhs.breadth > rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator <=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length <= rhs.length && lhs.height
<= rhs.height && lhs.breadth <= rhs.breadth)
{
status = true;
}
return status;
}
public static bool operator >=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.length >= rhs.length && lhs.height
>= rhs.height && lhs.breadth >= rhs.breadth)
{
status = true;
}
return status;
}
public override string ToString()
{
return String.Format("({0}, {1}, {2})", length, breadth, height);
}
}
class Tester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Declarar Box1, de tipo Box
Box Box2 = new Box(); // Declarar Box2, de tipo Box
Box Box3 = new Box(); // Declarar Box3, de tipo Box
Box Box4 = new Box();
double volume = 0.0; // Volumen
// Detalles de Box1
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// Detalles de Box2
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// Usar ToString() sobrecargado para mostrar los dos objetos
Console.WriteLine("Box1: {0}", Box1.ToString());
Console.WriteLine("Box2: {0}", Box2.ToString());
// Volumen de Box1
volume = Box1.getVolume();
Console.WriteLine("Volumen de Box1: {0}", volume);
// Volumen de Box2
volume = Box2.getVolume();
Console.WriteLine("Volumen de Box2: {0}", volume);
// Sumar los dos objetos
Box3 = Box1 + Box2;
Console.WriteLine("Box3: {0}", Box3.ToString());
// Volumen de Box3
volume = Box3.getVolume();
Console.WriteLine("Volumen de Box3: {0}", volume);
//comparing the boxes
if (Box1 > Box2)
Console.WriteLine("Box1 es mayor que Box2");
else
Console.WriteLine("Box1 no es mayor que Box2");
if (Box1 < Box2)
Console.WriteLine("Box1 es menor que Box2");
else
Console.WriteLine("Box1 no es menor que Box2");
if (Box1 >= Box2)
Console.WriteLine("Box1 es mayor o igual que Box2");
else
Console.WriteLine("Box1 no es mayor o igual que Box2");
if (Box1 <= Box2)
Console.WriteLine("Box1 es menor o igual que Box2");
else
Console.WriteLine("Box1 no es menor o igual que Box2");
if (Box1 != Box2)
Console.WriteLine("Box1 no es igual a Box2");
else
Console.WriteLine("Box1 es igual a Box2");
Box4 = Box3;
if (Box3 == Box4)
Console.WriteLine("Box3 es igual a Box4");
else
Console.WriteLine("Box3 no es igual a Box4");
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Box1: (6, 7, 5) Box2: (12, 13, 10) Box1 的体积: 210 Box2 的体积: 1560 Box3: (18, 20, 15) Box3 的体积: 5400 Box1 不大于 Box2 Box1 小于 Box2 Box1 不大于等于 Box2 Box1 小于等于 Box2 Box1 不等于 Box2 Box3 等于 Box4Otras extensiones