Sobrecarga de operadores en C# para tipos personalizados
Puede redefinir o sobrecargar la mayoría de los operadores integrados en C#. Así, un programador puede usar operadores con tipos definidos por el usuario. Los operadores sobrecargados son funciones con nombres especiales: la palabra clave operator seguida del símbolo del operador. Similar a cualquier otra función, un operador sobrecargado tiene un tipo de retorno y una lista de parámetros.
Ejemplo: Sobrecarga del operador +
public static Caja operator+ (Caja b, Caja c) {
Caja caja = new Caja();
caja.longitud = b.longitud + c.longitud;
caja.ancho = b.ancho + c.ancho;
caja.altura = b.altura + c.altura;
return caja;
}
Esta función implementa el operador de adición (+) para una clase Caja definida por el usuario. Suma los atributos de dos objetos Caja y devuelve el objeto Caja resultante.
Implementación de la sobrecarga de operadores
Ejemplo completo:
using System;
namespace AplicaciónSobrecargaOperadores {
class Caja {
private double longitud;
private double ancho;
private double altura;
public double GetVolumen() { return longitud * ancho * altura; }
public void SetLongitud(double len) { longitud = len; }
public void SetAncho(double bre) { ancho = bre; }
public void SetAltura(double hei) { altura = hei; }
// Sobrecarga del operador + para sumar dos objetos Caja
public static Caja operator+ (Caja b, Caja c) {
Caja caja = new Caja();
caja.longitud = b.longitud + c.longitud;
caja.ancho = b.ancho + c.ancho;
caja.altura = b.altura + c.altura;
return caja;
}
}
class Probador {
static void Main(string[] args) {
Caja Caja1 = new Caja();
Caja Caja2 = new Caja();
Caja Caja3 = new Caja();
double volumen = 0.0;
// Especificaciones caja 1
Caja1.SetLongitud(6.0); Caja1.SetAncho(7.0); Caja1.SetAltura(5.0);
// Especificaciones caja 2
Caja2.SetLongitud(12.0); Caja2.SetAncho(13.0); Caja2.SetAltura(10.0);
volumen = Caja1.GetVolumen();
Console.WriteLine("Volumen de Caja1: {0}", volumen);
volumen = Caja2.GetVolumen();
Console.WriteLine("Volumen de Caja2: {0}", volumen);
// Sumar dos objetos
Caja3 = Caja1 + Caja2;
volumen = Caja3.GetVolumen();
Console.WriteLine("Volumen de Caja3: {0}", volumen);
Console.ReadKey();
}
}
}
Resultado:
Volumen de Caja1: 210
Volumen de Caja2: 1560
Volumen de Caja3: 5400
Operadores sobrecargables y no sobrecargables
| Nº | Operadores y descripción |
|---|---|
| 1 | +, -, !, ~, ++, --: Operadores unarios (un operando), pueden sobrecargarse. |
| 2 | +, -, *, /, %: Operadores binarios (dos operandos), pueden sobrecargarse. |
| 3 | ==, !=, <, >, <=, >=: Operadores de comparación, pueden sobrecargarse. |
| 4 | &&, ||: Operadores lógicos condicionales, no pueden sobrecargarse directamente. |
| 5 | +=, -=, *=, /=, %=: Operadores de asignación compuesta, no pueden sobrecargarse. |
| 6 | =, ., ?:, ->, new, is, sizeof, typeof: No pueden sobrecargarse. |
Ejemplo extendido: Sobrecarga de más operadores
using System;
namespace AplicaciónSobrecargaOperadores {
class Caja {
private double longitud, ancho, altura;
public double GetVolumen() { return longitud * ancho * altura; }
public void SetLongitud(double len) { longitud = len; }
public void SetAncho(double bre) { ancho = bre; }
public void SetAltura(double hei) { altura = hei; }
public static Caja operator+ (Caja b, Caja c) {
Caja caja = new Caja();
caja.longitud = b.longitud + c.longitud;
caja.ancho = b.ancho + c.ancho;
caja.altura = b.altura + c.altura;
return caja;
}
public static bool operator == (Caja lhs, Caja rhs) {
return lhs.longitud == rhs.longitud && lhs.altura == rhs.altura && lhs.ancho == rhs.ancho;
}
public static bool operator !=(Caja lhs, Caja rhs) {
return lhs.longitud != rhs.longitud || lhs.altura != rhs.altura || lhs.ancho != rhs.ancho;
}
public static bool operator <(Caja lhs, Caja rhs) {
return lhs.longitud < rhs.longitud && lhs.altura < rhs.altura && lhs.ancho < rhs.ancho;
}
public static bool operator >(Caja lhs, Caja rhs) {
return lhs.longitud > rhs.longitud && lhs.altura > rhs.altura && lhs.ancho > rhs.ancho;
}
public static bool operator <=(Caja lhs, Caja rhs) {
return lhs.longitud <= rhs.longitud && lhs.altura <= rhs.altura && lhs.ancho <= rhs.ancho;
}
public static bool operator >=(Caja lhs, Caja rhs) {
return lhs.longitud >= rhs.longitud && lhs.altura >= rhs.altura && lhs.ancho >= rhs.ancho;
}
public override string ToString() {
return String.Format("({0}, {1}, {2})", longitud, ancho, altura);
}
}
class Probador {
static void Main(string[] args) {
Caja Caja1 = new Caja();
Caja Caja2 = new Caja();
Caja Caja3 = new Caja();
Caja Caja4 = new Caja();
double volumen = 0.0;
Caja1.SetLongitud(6.0); Caja1.SetAncho(7.0); Caja1.SetAltura(5.0);
Caja2.SetLongitud(12.0); Caja2.SetAncho(13.0); Caja2.SetAltura(10.0);
Console.WriteLine("Caja 1: {0}", Caja1.ToString());
Console.WriteLine("Caja 2: {0}", Caja2.ToString());
volumen = Caja1.GetVolumen();
Console.WriteLine("Volumen de Caja1: {0}", volumen);
volumen = Caja2.GetVolumen();
Console.WriteLine("Volumen de Caja2: {0}", volumen);
Caja3 = Caja1 + Caja2;
Console.WriteLine("Caja 3: {0}", Caja3.ToString());
volumen = Caja3.GetVolumen();
Console.WriteLine("Volumen de Caja3: {0}", volumen);
if (Caja1 > Caja2) Console.WriteLine("Caja1 es mayor que Caja2");
else Console.WriteLine("Caja1 no es mayor que Caja2");
if (Caja1 < Caja2) Console.WriteLine("Caja1 es menor que Caja2");
else Console.WriteLine("Caja1 no es menor que Caja2");
if (Caja1 >= Caja2) Console.WriteLine("Caja1 es mayor o igual que Caja2");
else Console.WriteLine("Caja1 no es mayor o igual que Caja2");
if (Caja1 <= Caja2) Console.WriteLine("Caja1 es menor o igual que Caja2");
else Console.WriteLine("Caja1 no es menor o igual que Caja2");
if (Caja1 != Caja2) Console.WriteLine("Caja1 no es igual a Caja2");
else Console.WriteLine("Caja1 no es mayor o igual que Caja2");
Caja4 = Caja3;
if (Caja3 == Caja4) Console.WriteLine("Caja3 es igual a Caja4");
else Console.WriteLine("Caja3 no es igual a Caja4");
Console.ReadKey();
}
}
}
Resultado:
Caja 1: (6, 7, 5)
Caja 2: (12, 13, 10)
Volumen de Caja1: 210
Volumen de Caja2: 1560
Caja 3: (18, 20, 15)
Volumen de Caja3: 5400
Caja1 no es mayor que Caja2
Caja1 es menor que Caja2
Caja1 no es mayor o igual que Caja2
Caja1 es menor o igual que Caja2
Caja1 no es igual a Caja2
Caja3 es igual a Caja4
Lenguaje C
- Mantenimiento Involucrando Operadores: ¿Superan las Ganancias a los Costos Ocultos?
- Robot DIY inspirado en Wall‑E con Raspberry Pi y caja de CD
- Operadores en C# – Guía completa de operadores en C#
- Operador ternario en C#: Guía concisa para expresiones condicionales
- Dominando la Sobrecarga de Métodos en C#: Conceptos, Ejemplos y Buenas Prácticas
- Dominando la Sobrecarga de Constructores en C#
- Sobrecarga de operadores en C++: Guía práctica con ejemplos de código
- Dominando la Sobrecarga en C++: Funciones y Operadores Explicados
- Fundamentos de MATLAB: Sintaxis Esencial y Comandos Básicos
- Dominando la Sobrecarga de Operadores en Python: Guía Práctica
- Operador instanceof en Java: Guía completa