Programación II. Guía No. 7 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación II Tema: Sobrecarga. Objetivos Describir como redefinir (sobrecargar) operadores para que funcionen con nuevos tipos de datos. Diferenciar sobrecarga de operadores binarios y unarios. Identificar cuando sobrecargar operadores. Implementar programas en C# que sobrecarguen operadores unarios. Materiales y Equipo Computadora con Visual Studio 2013. Guía Número 7. Introducción Teórica Recordemos que los operadores son un tipo de tokens que indican al compilador la realización de determinadas operaciones sobre variables u otros objetos (los operandos). Por ejemplo, cuando encontramos una expresión del tipo: z = x + y; // suponemos que x, y, z son de tipo int (1) Sabemos que la sentencia contiene dos operadores; el de suma (+) y el de asignación (=); que estos operadores actúan (operan) sobre objetos de tipo int, y que sus reglas de uso y su significado (que resultados se obtienen) están perfectamente definidos en el lenguaje. Los operadores aceptan uno o varios operandos de tipo específico (alguno de los tipos básicos preconstruidos en el lenguaje), produciendo y/o modificando un valor de acuerdo con ciertas reglas. Sin embargo, C# permite redefinir la varios de ellos. Es decir, permite que puedan aceptar otro tipo de operandos (distintos de los tipos básicos) y seguir otro comportamiento, al tiempo que 2 Programación II. Guía No. 7 conservan el sentido y comportamiento originales cuando se usan con los operandos normales. Esta posibilidad, que recibe el nombre de sobrecarga del operador, es una consecuencia del polimorfismo y hace posible que en la expresión: c = d + e; // suponemos que c, d, e son de tipo UnaClase (2) el sentido de la suma y el de asignación sean totalmente específicos y distintos que el de la expresión “1” anterior cuando se utilizaron los mismos operadores con operandos tipo int. NOTA: La primera e importantísima advertencia es que la sobrecarga se refiere y tiene aplicación solo cuando los operandos son instancias de clases. Es decir, no es posible modificar el sentido de la suma y asignación de la expresión “2” si c, d y e fuesen enteros o de cualquiera de los tipos básicos preconstruidos en el lenguaje. La sobrecarga de los operadores es una de las características más interesantes de C# y, naturalmente, de la programación orientada a objetos. La sobrecarga hace posible manipular objetos de clases con operadores estándar tales como +, *, [ ] y <<. Esta propiedad de los operadores permite redefinir el lenguaje C#, que puede crear nuevas definiciones de operadores. La sobrecarga es una característica que ofrece el lenguaje C# para aplicar una misma operación, a través de operadores o funciones, a diferentes tipos de datos. Se pueden sobrecargar los operadores predefinidos y funciones definidas por el usuario. La sobrecarga permite generalizar el uso de operadores y funciones. Sobrecarga de Operadores. Es el proceso de asignar dos ó más operaciones al mismo operador. En otras palabras, permite asignar una o más funciones adicionales a un operador estándar, con el fin de que ésta sea llamada según el contexto en el cual se utilice el operador. Un operador sobrecargado no puede tener parámetros predeterminados. Para sobrecargar un operador, y aplicarlo en operaciones entre clases, se usa la función especial operador. Programación II. Guía No. 7 3 Una función operador es una función cuyo nombre consta de la palabra reservada operator seguida de un operador unitario o binario que se sobrecargará. La sintaxis para sobrecargar un operador es la siguiente: public static <tipo de dato retornado> operator <operador a sobrecargar> (lista de parámetros) { //instrucciones que forman el cuerpo del operador } Donde: tipo de dato: indica el tipo de dato que produce el operador sobrecargado, por lo general es la referencia del objeto y es lo que se retornará. operator: es una palabra reservada utilizada para realizar la sobrecarga. Operador a sobrecargar: operador que estamos sobrecargando. Lista de parámetros: es la lista de objetos (en referencia) o variables que se procesarán en la sobrecarga. Operadores sobrecargables. El lenguaje C# permite redefinir la funcionalidad de los siguientes operadores: +, -, !, ~, ++, --, true, false, +, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=, &&, ||, [ ], +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= Los operadores +, - son sobrecargables en sus dos versiones, unaria y binaria. Es decir: suma binaria +; más unitario +. Cabe mencionar que en el caso de los operadores de comparación la sobrecarga se hace por pares: es decir == y != ; < y > ; <= y >=. Excepciones: Operadores que no pueden ser sobrecargados: = . ?: ?? -> => f(x) as checked unchecked default delegate is new sizeof typeof Sobrecarga de Operadores Binarios. Un operador binario tiene dos operandos o argumentos, uno a cada lado del operador. El operador “/”, por ejemplo, es binario. Algunos operadores tales como “+” son unitarios y binarios, dependiendo de su uso. 4 Programación II. Guía No. 7 Sobrecarga de operadores unarios. Se conocen también como operadores unitarios. Un operador unitario es un operador que tiene un único operando, en otras palabras, es aquel que actúa sobre un único operando. El operador “++”, por ejemplo es unario. Sobrecarga de funciones o métodos. La sobrecarga de funciones es el proceso de definir dos o más funciones, con el mismo nombre, que difieren únicamente en los parámetros que requieren y en el tipo de resultado que generan. Este tipo de sobrecarga resulta ser una poderosa herramienta de programación. Sin embargo, debe ser cuidadoso su uso ya que si se utiliza excesivamente el programa podría resultar poco legible. Además, es importante considerar que no es posible definir dos funciones que difieran sólo en el tipo de resultado. Deben hacerlo también en la lista de parámetros. ¿Cómo determina C# la función sobrecargada correcta? Lo determina en base al número y tipo de parámetros pasados a la función sobrecargada. C# requiere que al menos uno de los parámetros tenga un tipo diferente del que utilizan otras funciones. Por consiguiente, es válido declarar dos funciones sobrecargadas, tales como: int F (int a, int b, int c); int F (int a, int b, float c); C# puede llamar a ambas funciones, ya que al menos uno de los valores de los parámetros tiene un tipo diferente. Sin embargo, si se intenta escribir una función sobrecargada que tenga tipos similares, C# emitirá un error. Por ejemplo, las definiciones siguientes no se compilarán, ya que el compilador no diferenciará una de otra: int F (int a, int b, int c); int F (int a, int b, int c); La sobrecarga de funciones es un tipo específico de polimorfismo. El polimorfismo es una de las características fundamentales de la programación orientada a objetos. Programación II. Guía No. 7 5 Procedimiento Ejemplo 1: Bibliografía En C#, el operador de comparación == no permite comparar arreglos para saber si son iguales Guíao no, 1 pero ahora lo sobrecargaremos para ello. Hay que recordar que por ser comparación se sobrecargan en pareja con != Crear un proyecto nuevo y la clase con la que trabajaremos se llama ArregloF , en la clase es donde crearemos el método para sobrecarga. Funciones para sobrecargar a == y != Ambas deben ser public static De 6 Programación II. Guía No. 7 En el programa principal: Aquí se está utilizando sobrecarga Ejemplo 2: En este ejemplo se creará una clase llamada VectorEnteros aplicando sobrecarga unitaria haremos que los valores que originalmente almacenamos en el arreglo se incrementen en una unidad. Programación II. Guía No. 7 7 En el programa principal: Aplicando sobrecarga unitaria Ejemplo 3: En este ejemplo no utilizaremos una clase adicional, sino solamente funciones que estarán escritas dentro de la clase Program. El nombre genérico de esas funciones es Prueba y en base a los parámetros que le demos será capaz de realizar tres acciones diferentes. De tipo static para que no necesitemos una instancia para su invocación Programación II. Guía No. 7 8 Análisis de Resultados Ejercicio No. 1: Modifique el código del ejemplo 1 de tal forma que se trabaje con vectores de caracteres. En el primer vector se ingresará la palabra con normalidad y en el vector 2 se invertirá el orden. Por ejemplo Vector 1 = UNIVERSIDAD Vector 2 = DADISREVINU En dado caso los vectores sean iguales que muestre mensaje “PALÍNDROMO” caso contrario que diga “NO ES PALÍNDORMO” Ejercicio No. 2: Modifique el código del ejemplo No. 2, de tal manera que el programa sea una simulación del manejo de vectores en el espacio y que se maneje a través de un menú que contenga las siguientes opciones: a) Crear los objetos de tipo vector, solicitando los datos al usuario. b) Realizar la suma de vectores. c) Realizar la resta de vectores. d) Encontrar el módulo de vectores e) Realizar el producto escalar de vectores. f) Realizar el producto vectorial de vectores. g) Salir de la aplicación. El programa debe estar debidamente comentado. Investigación Complementaria Tarea No. 1: Crear un programa que incluya dos funciones sobrecargadas: Max: que permitirá encontrar el máximo entre dos números que pueden ser del tipo entero o real de precisión doble. Programación II. Guía No. 7 9 Raíz: que permitirá calcular la raíz cuadrada de un número que puede ser del tipo entero o real de precisión doble. La funcionalidad debe implementarse con un menú con las siguientes opciones: Opción de menú 1: Encontrar el máximo de dos números introducidos por el usuario. Opción de menú 2: Calcular la raíz cuadrada de un número introducido por el usuario. Opción de menú 3: Salir del programa. El menú deberá estar siempre activo, en la misma posición en pantalla, hasta que el usuario seleccione la opción salir. El programa debe estar debidamente comentado. Tarea No. 2: Investigue qué es el override, cómo se utiliza y en qué casos es más conveniente. Cree un ejemplo de ello. Qué es polimorfismo y cómo debe ser implementado en clases. Cree un ejemplo de ello. Fuentes de consulta https://msdn.microsoft.com/es-sv/library/8edha89s.aspx. Sitio de Microsoft C# sobrecarga de operadores. Consultado febrero 2016.