Sie sind auf Seite 1von 6

Universidad de Santiago de Chile

Facultad de Ingeniera
Departamento de Ingeniera Informtica
Paradigmas de programacin

Parametrizacin, sobrecarga
y espacios de nombres
TIPOS DE DATOS ABSTRACTOS PARAMETRIZADOS
Como hemos visto en clases anteriores, uno de los pilares fundamentales de la POO
corresponde a los tipos de datos abstractos. Se ha estudiado la herencia como una
estrategia para la reutilizacin de cdigo y el aumento de la productividad. Sin
embargo, muchas veces resulta engorroso crear una nueva subclase a partir de la clase
padre para dar soporte a un nuevo tipo de dato que slo se diferencia en uno que otro
detalle. Esto es especialmente cierto para los tipo de datos colecciones.
Una coleccin es una clase que representa un conjunto de objetos y define mtodos
para trabajar sobre ese conjunto. Por ejemplo, en clases anteriores se defini un mtodo
que recibe como parmetro una lista de automviles.
Lista de automviles
// Metodo que recorre la lista de automoviles y llama al
// metodo DibujaAuto
public static void MuestraAutomovilesSimple(List<Automovil> unidades) {
// Por cada automovil en la lista...
foreach (Automovil automovil in unidades)
{
// ...Llama al metodo DibujaAuto()
automovil.dibujaAuto();
}
}

La clase List recibe como argumento (entre parntesis angulares) el tipo de dato
abstracto Automovil. Esto quiere decir que la lista contendr slo objetos de la clase
especificada y que los mtodos de List trabajarn sobre este tipo de dato abstracto.
En C# al igual que en JAVA los tipos de datos parametrizados se conocen como
Generics. Estas clases y mtodos proveen reusabilidad, type safety (chequeo de tipos)
y eficiencia. La clase List as como otras clases genricas que representan colecciones
de objetos (collections) se pueden encontrar en el espacio de nombres
System.Collections.Generic.

1
Unidad 5 Programacin orientada a objetos 2-2013

Universidad de Santiago de Chile


Facultad de Ingeniera
Departamento de Ingeniera Informtica
Paradigmas de programacin
No slo es posible acceder a las clases y mtodos genricos provistos por C#, sino que
tambin es posible construir clases genricas personalizadas. El siguiente cdigo se
basa en la documentacin de C#.
Implementacin de una clase parametrizada utilizando Generics
// Clase parametrizada
class ClaseGenerica<T> {
// Metodo que recibe por parametro un valor
// de tipo T
public void metodoGenerico1(T valor) { }
// Metodo que retorna un valor de tipo T
public T metodoGenerico2(T valor) {
return valor;
}
}
// Clase de ejemplo
class otraClase { }
class Program {
static void Main(string[] args) {
ClaseGenerica<int> obj_1 = new ClaseGenerica<int>();
ClaseGenerica<long> obj_2 = new ClaseGenerica<long>();
ClaseGenerica<string> obj_3 = new ClaseGenerica<string>();
ClaseGenerica<otraClase> obj_4 = new ClaseGenerica<otraClase>();
obj_1.metodoGenerico1(45);
obj_3.metodoGenerico1("string");
otraClase aux = obj_4.metodoGenerico2(new otraClase());
}
}

Al instanciar nuevos objetos a partir de la clase ClaseGenerica es necesario proveer el


tipo de dato con el cual se va a trabajar. Al parametrizar la clase, todos los mtodos
de la misma pueden recibir por parmetro o retornar valores de tipo T.
Para conocer ms sobre Generics en C#, visita la siguiente documentacin:

http://msdn.microsoft.com/en-us/library/512aeb7t(v=vs.110).aspx

SOBRECARGA
La sobrecarga permite que operadores y mtodos se comporten de distinta manera
dependiendo de los parmetros actuales ingresados.

2
Unidad 5 Programacin orientada a objetos 2-2013

Universidad de Santiago de Chile


Facultad de Ingeniera
Departamento de Ingeniera Informtica
Paradigmas de programacin

SOBRECARGA DE OPERADORES
Muchos lenguajes de programacin incluyen sobrecarga de operadores. Por ejemplo, la
operacin suma de enteros y la operacin suma de punto flotantes usualmente se
representan por el mismo smbolo, en este caso +. Cuando se suman un entero y un
punto flotante, se promueve el entero a punto flotante (casting implcito) para luego
realizar la suma de punto flotante. En lenguajes como JAVA y C#, la operacin
concatenar strings tambin se representa por el smbolo +.
As mismo, el programador tambin puede definir nuevos comportamientos para los
operadores de C#:
Sobrecarga del operador +
public class Complejo {
/*
* En C# es posible utilizar propiedades.
* En este caso utilizamos propiedades auto implementadas
* para los metodos get y set.
* Ms informacion en:
* http://msdn.microsoft.com/es-es/library/x9fsa0sw(v=vs.110).aspx
*/
public int Real { get; set; }
public int Imaginario { get; set; }
// Constructores de la clase complejo
// Mas sobre this en
// http://msdn.microsoft.com/es-es/library/dk1507sz(v=vs.110).aspx
public Complejo() {
this.Real = 0;
this.Imaginario = 0;
}
public Complejo (int real, int imaginario) {
Real = real;
Imaginario = imaginario;
}
// Se define un metodo que sobrecarga el operador "+" para definir
// la suma de complejos. Note el uso de la palabra reservada operator
public static Complejo operator +(Complejo opIzq, Complejo opDer) {
return new Complejo (
opIzq.Real + opDer.Real, opIzq.Imaginario + opDer.Imaginario);
}}

En el cdigo anterior, la clase Complejo sobrecarga el operador + para definir la


suma de complejos, la cual se realiza sumando la parte entera y la parte imaginaria por
separado entre ambos operandos.

3
Unidad 5 Programacin orientada a objetos 2-2013

Universidad de Santiago de Chile


Facultad de Ingeniera
Departamento de Ingeniera Informtica
Paradigmas de programacin
Si bien la sobrecarga de operadores provee una manera de simplificar la
programacin, tambin tiene sus problemas. En particular, para abstracciones de datos
no comvencionales, leer el cdigo puede resultar engorroso ya que es necesario un
acabado entendimiento de cmo se realiza la operacin sobrecargada. En el cdigo
anterior, es de conocimiento general como se realiza la suma de complejos, por lo que no
reviste mayor problema.
Por otro lado, nada impide que sobrecarguemos el operador + y lo definamos
como la multiplicacin de dos operandos. Tambin existen algunas consideraciones
con respecto al proceso de compilacin, los cuales estn fuera del alcance de este curso.
Todos los operadores que pueden ser sobrecargados en C# son mtodos estticos. Los
operadores sobrecargables se pueden consultar en:

http://msdn.microsoft.com/en-us/library/8edha89s(v=vs.110).aspx

SOBRECARGA DE MTODOS
A diferencia de la sobrecarga de operadores, la sobrecarga de mtodos depende no slo
del tipo de parmetros que recibe, sino tambin el nmero de stos, el tipo de
retorno e incluso, en algunos casos, el orden de los parmetros. En el cdigo visto
anteriormente, se definen dos constructores para la clase complejo: uno que no recibe
parmetros y otro que recibe dos enteros. En este sentido, cada mtodo sobrecargado
tiene diferente protocolo (firma o declaracin).
En C# no es posible construir dos mtodos con el mismo nombre, parmetros de entrada
y diferente tipo de salida. En otras palabras, C# utiliza slo los parmetros de entrada
para encontrar el mtodo correcto en tiempo de ejecucin.
Los mtodos que normalmente se sobrecargan son los constructores de clases.

ESPACIOS DE NOMBRES
Hasta el momento hemos hablado de clases como el mecanismo (junto con las
estructuras en C#, que no hemos cubierto en los documentos) que provee la POO para
representar un tipo de dato abstracto. El proceso de abstraccin de datos se ve reflejado
en una clase, la cual encapsula atributos y mtodos necesarios para representar y operar
con el nuevo tipo de dato.

4
Unidad 5 Programacin orientada a objetos 2-2013

Universidad de Santiago de Chile


Facultad de Ingeniera
Departamento de Ingeniera Informtica
Paradigmas de programacin
Existe otro tipo de encapsulacin conocido como encapsulacin de nombres
(naming encapsulation). En un entorno de trabajo donde muchos desarrolladores agregan
nuevas clases y mtodos a un proyecto de software, muchas veces ocurren alcances de
nombre: El identificador de una clase se repite en ms de una unidad o mdulo. Si
bien basta con seguir un protocolo de nombramiento, tambin es posible que el nombre
de la clase sea pertinente en ambos casos a pesar del protocolo.
Ejemplo 1: List<T> de C# y List<T> definida por el programador
using System.Collections.Generic;
// Esta clase tiene el mismo nombre que
// la clase List<T> definida en el espacio
// de nombres System.Collections.Generic
class List<T> { }
class Program {
static void Main(string[] args) {
// De que tipo es el objeto que se esta
// instanciando?
// - List<int> o
// - System.Collections.Generic.List<T>
List<int> lista = new List<int>();
System.Console.WriteLine();
}
}

Imagine el siguiente escenario utilizando el cdigo anterior: A usted se le pide


implementar un tipo de dato abstracto parametrizado Lista, el cual ser utilizado a lo
largo de todo el sistema, que tiene las mismas funcionalidades que la clase List que
provee C# pero que las operaciones de insercin y borrado son mucho ms eficientes. Se
ha pedido explcitamente que el nombre de la clase sea List, ya que esto tendr un
menor impacto en el sistema (no sera necesario cambiar el cdigo) y permitir que los
dems desarrolladores sigan utilizando el identificador List al cual estn acostumbrados.
Para lograr lo anterior, es posible encapsular la clase List<T> en un espacio de
nombres.
En el ejemplo 1, la clase List<T> implementada por el desarrollador esconde la clase
List<T> definida en el espacio de nombre System.Collections.Generic, por lo que el
objeto instanciado en main es de tipo List<T> implementada por el desarrollador. En
el ejemplo 2, el objeto instanciado es de tipo List<T> de System.Collections.Generic.
Ejemplo 2: Espacio de nombres misContenedores
using System.Collections.Generic;

5
Unidad 5 Programacin orientada a objetos 2-2013

Universidad de Santiago de Chile


Facultad de Ingeniera
Departamento de Ingeniera Informtica
Paradigmas de programacin
// Encapsulamos la clase List<T> en
// un espacio de nombres
namespace misContenedores {
class List<T> { }
}
class Program {
static void Main(string[] args) {
// De que tipo es el objeto que se esta
// instanciando?
// - List<int> o
// - System.Collections.Generic.List<T>
List<int> lista = new List<int>();
}
}

Cmo defino qu clase estoy utilizando? Esto se hace a travs de la palabra reservada
using. En el cdigo anterior, si se quiere utilizar la clase List<T> implementada por el
desarrollador basta con cambiar:
// Todas las referencias List<T> corresponde a la clase definida en
// el espacio de nombres System.Collections.Generic.
using System.Collections.Generic;

por:
// Todas las referencias List<T> corresponde a la clase definida en
// el espacio de nombres misContenedores.
using misContenedores;

En Java los espacios de nombres se definen con la palabra reservada package, y para
acceder a las clases se utiliza la palabra reservada import.
Tambin es posible acceder a clases encapsuladas en un espacio de nombre sin
necesidad de utilizar using. Por ejemplo:
System.Console.writeLine();

Corresponde al namespace System, class Console y mtodo writeLine().


Podramos nosotros definir nuestro propio espacio de nombres Console?

6
Unidad 5 Programacin orientada a objetos 2-2013

Das könnte Ihnen auch gefallen