Sei sulla pagina 1di 20

M.Sc.

Javier David Chávez Centeno


DEPARTAMENTO ACADÉMICO DE INFORMÁTICA
jdchavez5@hotmail.com

CUSCO – PERÚ
2013
UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

UNIDAD I

TEMA

Sobrecarga de Operadores

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 2


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

CONTENIDO
1.1 Concepto
1.2 Definición de sobrecarga de operadores
1.3 Redefinición de operadores unarios
1.4 Redefinición de operadores binarios
1.5 Ejemplos

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 3


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

Los operadores en C# son símbolos que


permiten realizar operaciones con uno o más
datos, para dar un resultado. El ejemplo clásico
de operador es el símbolo de la suma (+),
aunque hay otros muchos.
En C# viene predefinido el comportamiento de
sus operadores cuando de aplican a ciertos
tipos de datos. Por ejemplo, si se aplica el
operador + entre dos objects int devuelve su
suma, y si se aplica entre dos objetos string
devuelve su concatenación. Las siguientes
líneas de código muestra un ejemplo típico:
JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 4
UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

En cada caso el operador + tiene un


comportamiento acorde a los tipos de datos
sobre los que se aplica.
Sin embargo, también se permite que el
programador pueda definir el significado de la
mayoría de estos operadores cuando se apliquen
a objetos de tipos que él haya definido, y esto es
a lo que se le conoce como sobrecarga de
operadores (ó redefinición de operadores).
JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 5
UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

Sobrecargar un operador no aporta ninguna nueva


funcionalidad al lenguaje y sólo se ha incluido en
en C# para facilitar la legibilidad del código. Por
ejemplo, si se tiene una clase CNroComplejo que
representa números complejos podríamos definir
un método Sumar() para sus objetos de modo que
a través de ella se pudiese conseguir la suma de
dos objetos de esta clase como se muestra en el
ejemplo:

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 6


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

El código sería mucho más legible e intuitivo si


en vez de tenerse que usar el método Sumar() se
sobrecargara el significado del operador + para
que al aplicarlo entre objetos de tipo
CNroComplejo devolviese su suma. Con ello, el
código anterior quedaría así:

Esta es precisamente la utilidad de la redefinición


de operadores: hacer más claro y legible el código.
JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 7
UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

Sintaxis general de redefinición de


operadores.- La forma cómo se redefine un operador
depende del tipo de operador del que se trate, ya que no es lo
mismo definir un operador unario que uno binario. Como regla
general se hace definiendo un método público y estático cuyo
nombre sea el símbolo del operador a redefinir y venga
precedido de la palabra reservada operator. Tal como se muestra:

No puede ser Al menos uno de los operandos, ha de ser del mismo tipo
de dato del que sea miembro la redefinición del operador.

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 8


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

Aunque C# no permite la sobrecarga de todo los operadores que


maneja, si lo hace para la mayoría de operadores relacionados
con las matemáticas y los bits. En la siguiente figura se
muestran todos los operadores que admiten sobrecarga:

La sobrecarga para los operadores de comparación, siempre se


harán por parejas. Los operadores lógicos (&& y ||), los
operadores de asignación y los operadores (=, ., ?:, new, is) no
se pueden sobrecargar.
JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 9
UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 10


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

Toda redefinición de un operador unario ha de tomar un único


parámetro que ha de ser del mismo tipo (CNroComplejo) que el
tipo de dato al que pertenezca la redefinición.

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 11


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

Los operadores ++ y -- siempre ha de redefinirse de


manera que el tipo de dato del objeto devuelto sea el
mismo que el tipo de dato donde se definen.
Cuando se usen de forma prefija se devolverá ese
objeto, y cuando se usen de forma postfija el
compilador lo que hará será devolver el objeto original
que se les pasó como parámetro en lugar del indicado
en el return.
Veamos un ejemplo, considerando 1 :

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 12


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

En la forma prefija se devuelve ese objeto.

En la forma sufija se devuelve el objeto original.

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 13


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

Nótese que si hubiésemos redefinido el operador ++ de esta otra


forma:

El resultado devuelto al aplicárselo a un objeto siempre sería el


mismo tanto si fue aplicado de forma prefija como si lo fue de
forma postfija, ya que en ambos casos el objeto devuelto sería el
mismo. Veamos un ejemplo considerando 2 :

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 14


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

En la forma prefija y postfija el objeto devuelto es el


mismo.

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 15


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

Los operadores true y false


Tanto si un objeto representa el valor lógico cierto y otro
el valor lógico falso, entonces sus redefiniciones
siempre han de devolver un objeto de tipo bool. Además,
si se redefine uno es obligatorio redefinir el otro.
Los operadores true y false no pueden usarse directa-
mente en el código fuente, sino que redefinirlos para un
tipo de dato es útil porque permiten utilizar objetos de
ese tipo en expresiones condicionales tal y como si de
un valor lógico se tratase.
JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 16
UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

Por ejemplo, podemos redefinir estos operadores en el tipo


CNroComplejo de modo que consideren cierto a todo complejo
distinto de 0 + 0i y falso a 0 + 0i:

Con estas redefiniciones, un código como el que sigue mostraría


por pantalla el mensaje Es cierto para c1 y Es falso para c2.

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 17


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 18


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

Toda redefinición de un operador binario ha de tomar dos


parámetros tales que al menos uno sea del mismo tipo de dato
del que es miembro la redefinición.
Los operadores que tengan complementario siempre han de
redefinirse junto con éste. Es decir, siempre que se redefina en
un tipo el operador > también ha de redefinirse en él; el
operador <, siempre que se redefina >= ha de redefinirse <=, y
siempre que se redefina == ha de redefinirse !=.
Hay que tener en cuenta que al redefinir el operador + quedará
redefinido consecuentemente +=, al redefinir * lo hara *=, etc.

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 19


UNIVERSIDAD DE SAN ANTONIO ABAD DEL CUSCO – PERÚ - 2013

JAVIER DAVID CHÁVEZ CENTENO 07/09/2018 Dpto Académico de Informática 20

Potrebbero piacerti anche