Você está na página 1de 6

12/01/2009

ndice POLIMORFISMO
Luis Gonzaga Prez Cordn A3-148 Tel. 953213018 Definicin de polimorfismo Clasificacin de polimorfismo
Tipos genricos Sobrecarga
Operadores Funcionales

Polimorfismo dinmico

Clasificaciones
En orientacin a objetos podemos encontrar varias formas de clasificar los elementos:
Clases: Un objeto pertenece a una clase si comparte el interfaz y la representacin interna con todos los objetos de la clase. T.A.D. (Tipo Abstracto de Datos): Un objeto pertenece a un Tipo Abstracto de Datos si comparte el mismo interfaz. Polimorfsmo: es una clasificacin funcional sintctica. Agrupamos todos aquellos funcionamientos que sintcticamente se parecen (que tienen la misma cadena de caracteres).

Tipos genricos
Ventajas Desventajas En que lenguajes existen Como simular un tipo genrico en un lenguaje que no lo tiene. Carencias de esta solucin

Tipos genricos
Ventajas:
Evitar la duplicacin de cdigo para tipos q que se comportan del mismo modo y que, p q , en general, son colecciones de objetos de otros tipos: Lista de enteros, reales. Mayor facilidad de modificacin de cdigo.

Tipos genricos
Desventajas:
La modificacin de un tipo genrico implica la recompilacin de todos los programas p p g que se utiliza.

12/01/2009

Tipos genricos
template <class T> class Vector { T* v; int sz; public: vector (int); T& elem (int i) {return v[i]}; }

Tipos genricos
int main(){ Vector<int> * vectorEnteros; Vector<float> * vectorFlotantes }

Tipos genricos
Los tipos genricos solo tienen sentido en lenguajes con tipos bsicos.
Smalltalk es un lenguaje sin tipos y por lo tanto no necesita de Tipos genricos. C++ tiene tipos bsicos, y no tiene implementados las clases Integer, Double Si quiere hacer clases que trabajen de forma genrica con estos tipos necesita de tipos genricos C# NO tiene tipos genricos porque no necesita trabajar con tipos bsicos y lo puede hacer solo con objetos

Tipos genricos
Como soluciona C# los tipos genricos: class vector { protected object v; protected int sz; public vector (int tam) {}; public object elem (int i) {return v[i]}; }

Tipos genricos
Carencias de esta solucin:
Podr almacenar cualquier subclase de la clase object. Con tipos genricos restringimos a una j p g g clase determinada (y sus subclases)

Polimorfismo de sobrecarga
Definicin Algoritmo que sigue C# para la eleccin del mtodo sobrecargado

12/01/2009

Polimorfismo de sobrecarga
Definicin: dos funciones, procedimientos u operadores que se llaman igual se distinguen por el tipo de sus argumentos o por el nmero de sus argumentos.

Polimorfismo de sobrecarga
Ejemplo int a=5; int b=6; b 6; int c=a+b; // c vale 11 String a=Ho; String b=la; String c=a+b; // c vale Hola

Polimorfismo de sobrecarga
Ejemplo class Gato{ public Gato(){} public Gato(String nombre){} bli G t (St i b ){ } public void comer(Planta planta){} // metodo 1 public void comer(Planta planta, int x, int y){} //2 public void comer(ComidaGatos comida){} //3 }

Polimorfismo de sobrecarga
Gato gato = new Gato(Ruffy2); Planta planta = new Planta(); ComidaGatos comida = new ComidaGatos(); gato.comer(planta); //ejecuta mtodo 1 gato.comer(planta,3,4); //ejecuta mtodo 2 gato.comer(comida); // ejecuta el mtodo 3

Polimorfismo de sobrecarga
Qu pasa si a una llamada le corresponden varios mtodos?

Polimorfismo de sobrecarga
Ejemplo class Gato{ public Gato(){} public Gato(String nombre){} bli G t (St i b ){ } public void comer(Planta planta){} // metodo 1 public void comer(Geranio planta){} // mtodo 2 public void comer(Roedor rt){} // mtodo 3 public void comer(object o){} // mtodo 4 } class Geranio : Planta{};

12/01/2009

Polimorfismo de sobrecarga
Gato gato=new Gato();; Geranio geranio= new Geranio(); gato.comer(geranio); /* Mtodo 1 , 2 o 4? Geranio es una Planta y un Geranio y un object. En teora todos los mtodos son factibles por cual se decanta? */

Polimorfismo de sobrecarga
Algoritmo que sigue C# para la eleccin del mtodo sobrecargado:
1.

2.

3.

Encontrar todos los mtodos que tengan el nombre correcto y el nmero de parmetros coincidan. Adems los tipos de estos parmetros tienen que ser asignables. Si coinciden exactamente entonces se ejecutar ese mtodo. Si no existe se elegir el mtodo ms cercano (ms especifico). En caso de ambigedad dar error.

Polimorfismo dinmico
Conceptos iniciales Visin inicial de polimorfismo

Polimorfismo dinmico
Conceptos iniciales:
Un identificador o variable es simplemente un nombre Un valor describe los contenidos actuales de la memoria asociados con una variable Existe situaciones en las que el tipo (clase) de la variable no concuerdan con el tipo (clase) que contiene el valor. La clase de la variable se conoce como clase esttica y la clase del valor se conoce como la clase dinmica

Polimorfismo dinmico
Visin inicial de polimorfismo
Hemos dicho que tenemos:
Tipo esttico de una variable: es el tipo que posee una determinada referencia deducible del texto del programa y conocido en tiempo de compilacin. Tipo dinmico de una referencia: es el tipo de esa referencia en tiempo de ejecucin.

Polimorfismo dinmico
Ejemplo: object a; a = new Hashtable(); /* Tipo esttico: object Tipo dinmico: Hashtable */ a = new Arraylist(); /* Tipo esttico: object Tipo dinmico: Arraylist */

Cuando hay polimorfismo ocurre que solo hay un tipo esttico y varios dinmicos.

12/01/2009

Polimorfismo dinmico
Ejemplo (continuacin): Es muy importante que exista una relacin de herencia entre los tipos estticos y dinmicos, de forma que el esttico sea una superclase de los dinmicos.
object

Polimorfismo dinmico
Ejemplo: Double elemento; elemento = new Double(5.0); elemento = new Integer(5); /* Falla porque un Integer no es un Double!!! */

Integer

Double

Polimorfismo dinmico
El polimorfismo dinmico me permite tener varios cdigos para una misma signatura y que el cdigo que se ejecute al final depende del contexto en el que me encuentre.

Polimorfismo dinmico
Limitaciones de uso: C# es fuertemente tipado -> comprueba que las llamadas a los mtodos concuerden con alguno de los mtodos de la clase esttica aunque luego el que se ejecute sea de la clase dinmica

Ejemplo
Trabajador

Ejemplo

JefePersonal

Tecnico

12/01/2009

Ejemplo
vectorTrabajadores[1].descansar() -> no funciona porque la clase esttica NO tiene este mtodo -> da un error antes de que se ejecute el programa vectorTrabajadores[i].trabajar() -> ejecuta el mtodo de la clase dinmica (trabajador, JefePersonal o Tecnico)

Você também pode gostar