Beruflich Dokumente
Kultur Dokumente
Contenido
Concepto de clase, mtodo, mensaje, objeto Ejemplo: un programa para manejo de Pozos
Ocultamiento de informacin
Algunos lenguajes orientados a objeto
Contenido
Herencia Composicin
Delegacin
Tipos parametrizados
Contenido
Herencia y tipos
Conversin de tipos
Herencia de clases y herencia de interfaces
Ocultamiento de informacin
Acoplamiento y cohesin
Control de acceso y visibilidad
Contenido
Polimorfismo
Interfaces
Patrones de diseo
Patrones creacionales
Patrones estructurales Patrones de comportamiento
Contenido
Sincronizacin
Prcticas recomendadas
JDBC
Conceptos Generales
El segundo sostiene que la POO es simplemente una evolucin de tcnicas de programacin ya existentes (tipos de dato abstractos)
Clase Men
mostrar
App
Mensaje
Menu Receptor
Accin: muestra las opciones del menu
Emisor
Receptor
Accin: Imprime los datos de la factura
Mensaje. Un mensaje es una solicitud de que se realice una accin. Se acompaa de cualquier informacin adicional (argumentos) necesaria para llevar a cabo la accin Mtodo. Es la accin que realiza el receptor de un mensaje para satisfacer la solicitud (un procedimiento) Diferencias entre llamar a un procedimiento y pasar un mensaje:
Los mensajes tienen un receptor, los procedimientos no La accin que se realiza en respuesta a un mensaje depende de quien recibe el mensaje
Mostrar
Men
Mostrar
Factura
Fecha: 12/03/00 Cliente: Pedro Prez Cant. Descrip. Monto 1 Lavadora 5000,00 2 ...
Todos los objetos son ejemplares de una clase El mtodo invocado por un objeto en respuesta a un mensaje queda determinado por la clase del receptor Todos los objetos de una clase usan un mismo mtodo en respuesta a un mismo mensaje
Objetos. Son entes capaces de responder a un mensaje ejecutando una accin (mtodo)
Los objetos tienen variables internas que determinan su estado. Las variables que tiene un objeto dependen de la clase pero los valores son particulares de cada objeto
Decidir que objetos se necesitan para resolver un problema Determinar que mtodos implementa cada clase
En este ejemplo se presenta una clase Cuenta que puede ser el fundamento para un programa de manejo de cuentas
setNombre(String nombre) {
this.nombre = nombre;
} public double getSaldo(){ return saldo; }
return id;
} public void setId(int id) { this.id = id; } public String getNombre() { return nombre; } }
}
return false; }
Declaracin de la clase
Variables
Mtodos
Los mtodos son procedimientos que se ejecutan cuando se pasa un mensaje a la clase
Constructores
Estructura de un mensaje
c.setId(2);
receptor del mensaje mensaje argumentos
return ROJO;
else {
return NEGRO;
}
Procedimientos. Mdulos.
La programacin orientada a objetos puede verse como una evolucin de los tipos de dato abstractos.
Tipo de dato abstracto: un tipo de dato definido por el programador.
Consiste de una estructura de datos y una serie de operaciones implementadas mediante procedimientos o funciones.
Las clases son un mecanismo o tcnica de implementacin de tipos de dato abstracto. Al definir un TDA mediante clases se pueden especificar las operaciones vlidas para el nuevo tipo de dato. Esto permite al compilador verificar la validez de las operaciones al igual que para los tipos de datos predefinidos.
struct pila { int tope; int valores[100]; }; void push(struct pila *p, int v) { p->valores[++(ps->top)]=v; return; } void pop(struct pila *p) { if (empty(p)) { /* error */ } else { return (p->valores[ps->top-]); } }
p.valores[5]=10; // bien
}
public class Pila { private int tope; private int valores[100]; public Pila() { tope = -1; } public void push(int v) { valores[++top]=v; return; } public int pop() { if (empty(p)) { /* error */ } else { return (valores[top--]); } } }
//error
Bjarne Stroustrup, creador del C++, prefiere el trmino tipo de dato definido por el usuario al de clase
En lugar de Subclase habla de tipo de dato derivado
Quin invoca un mtodo de un objeto mediante un mensaje no tiene que saber lo que hace el objeto para satisfacer la solicitud
En este ejemplo se esta modificando directamente una variable interna del objeto c. Esto no es recomendable
Si se cambia la implementacin de la clase Cuenta, todas las partes del programa que contengan construcciones de este tipo debern ser modificadas Las variables internas de un objeto solo deben ser modificadas por el objeto mismo
La forma correcta de modificar el identificador de la cuenta es invocando un mtodo diseado para ese fin
c.setId(2);
En Java existen modificadores que permiten determinar la visibilidad de los elementos de una clase:
private. Solo se puede acceder al elemento desde la clase en la cual est declarado
protected. Se puede acceder al elemento desde la clase, las subclases y el paquete package. Se puede acceder al elemento desde la clase y cualquier otra clase que est en el mismo paquete
Mtodos que son invocados por otros mtodos de la misma clase y que no deben ser invocados externamente
Las constantes
Las variables de instancia que se sabe que sern accedidas por subclases de la clase en la cual est declaradas Esto es controversial. Hay quienes sostienen que las subclases deben acceder a las variables de las superclases invocando mtodos pblicos o protegidos.
Package se puede usar en lugar de protected para permitir que subclases accedan a las variables de instancia de las superclases.
En C++
En smalltalk
No existen modificadores, todas las variables son privadas y todos los mtodos son pblicos
Smalltalk
Las clases se implementan mediante un nuevo tipo de dato (class) similar a una estructura que permite definir, adems de variables, una lista de mtodos que constituyen el comportamiento de los ejemplares El problema principal de estos lenguajes es la implementacin de clases mediante tipos de dato. Esto causa problemas sobre todo en el manejo de la herencia
En general son ms eficientes que los lenguajes 100% orientados a objetos
Java
Lenguaje con tipos (por tanto presenta los mismos problemas que C++ y Object Pascal)
Existe una jerarqua de clases predefinida que incluye clases que representan los tipos de dato bsicos (integer, float, etc) Es un lenguaje interpretado. Menos eficiente que C++ Existen, sin embargo, compiladores just in time, que mejoran considerablemente la eficiencia
Cuales son las clases que se necesitan para la solucin de un problema en particular Que acciones debe realizar cada clase Como se relacionan las clases
Existen numerosas metodologas de diseo orientado a objetos Presentamos un mtodo conocido como Diseo dirigido por responsabilidades
Se hace una analoga entre las clases que se requieren para la solucin de un problema y un grupo de personas que se renen para realizar una actividad Cada clase corresponde a una persona A cada persona se asignan una serie de responsabilidades
Toda accin que se debe realizar debe estar asignada a una persona (en caso contrario la accin no se realizar)
La lista de responsabilidades son todas las acciones que debern realizar los miembros de la clase
En ltima instancia las responsabilidades se convertirn en mtodos de la clase La lista de colaboradores est formada por aquellas clases en las cuales se puede apoyar una clase para realizar su trabajo Al comienzo del diseo no se hace distincin entre clases y ejemplares
Los nombres de las clases deben ser palabras pronunciables, que describan claramente aquello a lo que se refieren
Se recomienda usar maysculas o el carcter de subrayado para separar las palabras. Ej. MenPrincipal o menu_principal Las abreviaturas deben ser claras Se debe evitar el uso de nmeros en los nombres
ManejadorCuentas manejador_cuentas
Las clases se pueden agrupar en categoras segn el tipo de responsabilidades que tienen
Clases auxiliares
Los datos que pertenecen a una clase manejadora de datos solo deben ser manipulados por su dueo (encapsulamiento)
Las dems clases no deben modificar o leer directamente los datos que pertenecen a un manejador de datos Para tener acceso a la informacin deben solicitarlo mediante un mensaje a la clase duea Es un factor importante del diseo determinar cuales datos deben ser manejados por una clase manejadora de datos
Procesador Transacciones
ObtenerSaldo(100)
Manejador Cuentas
LeerCuenta(100)
Son clases que generan datos (por ej. un generador de nmeros aleatorios), o los aceptan para realizar algn procesamiento
Los datos fluyen a travs de la clase pero sta no es duea de los datos
Por ejemplo una clase Archivo que tiene como responsabilidades
Archivo de facturas
Archivo de cuentas
Generalmente el cdigo que realiza estas actividades es complejo, modificado frecuentemente e independiente de los datos que se muestran
Es recomendable separar el cdigo de visualizacin del cdigo de manejo de los datos Cuando se tiene un manejador de datos y una clase de vista asociada se dice que el manejador de datos es el modelo y la clase visualizadora es la vista
La clase Pozo es un manejador de datos. Sus instancias representan o modelan pozos del mundo real
Un graficador de pozos tiene tiene una lista de pozos y se encarga de mostrar una grfica con la informacin que ellos contienen
Clase de visualizacin
Manejador de datos
Graficador Pozos
Pozo
Se tiene una base de datos con informacin histrica de pozos Se desea crear una aplicacin que permita visualizar una grfica de la produccin de crudo y gas de los pozos.
Un formulario mediante el cual se puede introducir una lista de las clases que se desea visualizar y las caractersticas del grfico que se desea obtener Una clase GraficadorPozos que se encarga de crear el grfico con las caractersticas definidas por el usuario. Es una clase de visualizacin Una clase Pozo que almacena la informacin de un pozo. Es una clase manejadora de datos Una clase BaseDatos que hace acceso a la base de datos que contiene la informacin de los pozos
Formulario
Graficador Pozos
GraficadorPozos
Pozo
Crear los pozos con los identificadores de pozos recibidos del Formulario Solicitar a cada pozo la produccin de crudo y de gas
Pozo
BaseDatos
Leer los datos del pozo al cual representa Mantener los datos del pozo Devolver la produccin de crudo y gas
BaseDatos
Devolver la produccin de crudo de un pozo dado el id del pozo Devolver la produccin de gas de un pozo dado el id del pozo
Entregar el dinero
LectorDeTarjetas
Verificador DeClave
SelectorDe Actividad
Devolver Tarjeta
ManejadorD eCuenta
ManejadorD eCuenta
SelectorDeActividad
ManejadorDe Depsitos
ManejadorDe Retiros
ManejadorDeRetiros
Preguntar al usuario cantidad del retiro Verificar la cantidad con el ManejadorDe Cuenta Decirle a CajaElectrnica que descarge el efectivo
ManejadorDe Cuentas
ManejadorDe Retiros
CajaElectrni ca
CajaElectrnica
Es una notacin para representar modelos orientados a objetos A finales de la dcada de los 80 aparecieron varios mtodos de modelado: Booch, Rumbaugh y Jacobson UML es la unificacin de estos mtodos Est en proceso de estandarizacin por ISO/ANSI
Un modelo consiste de clases y objetos relacionados entre si, que describen o representan un aspecto del mundo real
Para la descripcin de un modelo en UML existen varios tipos de diagramas:
Diagramas de secuencia
Use cases (casos de uso)
Una vista de un sistema que hace nfasis en la estructura de los objetos, incluyendo sus clasificadores, relaciones, atributos y operaciones
Una clase se representan mediante un rectngulo dividido en tres reas o bandas: banda de nombre, banda de atributos y banda de operaciones
Pozo
Id produccinCrudo produccinGas devolverProduccinCrudo devolverProduccinGas
Se utiliza tambin un diagrama simplificado de clases en el que se omiten la segunda y tercera banda
En este caso la clase Pozo se representa como sigue
Pozo
UML permite definir varios tipos de relacin entre clases. A continuacin se enumeran algunos
Asociacin
Agregacin Composicin
Generalizacin
Para representar relaciones de asociacin entre clases se usan lneas para conectar las clases relacionadas
Graficador Pozos
1
tiene
Pozo
La multiplicidad sirve para especificar cuantos ejemplares de una clase se pueden asociar con un ejemplar de la otra clase En el ejemplo un GraficadorPozos se puede asociar con 0 o ms pozos (* denota 0..n)
* 1..* 1..40
T
T
T T
Exactamente 5
Ejemplos adicionales
Emplea
Empresa
*
Patrono
1..*
Empleado
Persona
Empresa
*
Patrono
1..*
Empleado
Persona
Contrato
Ejemplo
Universidad
1..* Tiene
Facultad
Composicin
La composicin es un forma de agregacin que implica una fuerte relacin de propiedad
Avin
1
Fuselaje
1
TrenAterrizaje
2
Motor
Composicin
Avin Motor 2
Fuselaje 1
TrenAterrizaje 1
Es una relacin entre una clase general y una clase ms especfica Ejemplo
Empleado
Gerente
Vendedor
Formulario Pozos
BaseDatos
1
tiene 1 1 1..* tiene
1
1
Graficador Pozos
tiene
Pozo
Diagramas de secuencia
LectorTarjeta
Verificador Clave
Manejador Cuenta
Manejador Teclado
Verificar(noCta)
DevolverClave()
LeerClave()
Creacin de objetos
Creacin de objetos
Una vez que se han definido las clases, el siguiente paso es crear objetos
Al momento de arrancar el programa deber crear uno o varios objetos iniciales (por lo menos uno) Posteriormente los diferentes objetos que constituyen el programa pueden crear (y destruir) otros objetos Por lo tanto la creacin y destruccin de objetos es un proceso que se realiza durante toda la ejecucin del programa Cuando el programa finaliza el ltimo paso debe ser destruir el objeto (u objetos) creado inicialmente
Creacin de objetos
Memoria esttica
Creacin de objetos
Memoria automtica
Conocida como la pila del programa La memoria se asigna y libera automticamente Las variables se asignan cuando se ejecuta el bloque de cdigo donde estn declaradas Por ejemplo, en C++ o Java
void graficar() { int n; Pozo p(10); ... }
Creacin de objetos
Memoria esttica
Las variables estticas se asignan cuando el programa arranca y se liberan cuando termina
void graficar() {
static Pozo p(10); static int x;
...
}
Creacin de objetos
Memoria esttica
Ejemplo en C y C++
void getNextNumber() { static int number = 0; number += 1; return number; } void main() { int n; for (n=0; n<5 ; ++n) { printf("%d ", getNextNumber()); } }
Creacin de objetos
Memoria esttica
Ejemplo en Java
class MyClass { public static int number = 0; ... }
La variable se asigna al momento de cargar la clase (generalmente la primera vez que se usa)
Creacin de objetos
Memoria dinmica
Los objetos son creados en memoria dinmica de manera explcita, es decir, el programador determina el momento exacto en que se debe crear el objeto. As mismo los objetos deben ser destruidos por el programador Por ejemplo en C++
void graficar() {
Pozo *p; p = new Pozo(2);
...
delete p; }
Creacin de objetos
En C++ se pueden crear objetos de varias maneras
Pozo p(2);
// se ha creado un pozo
Creacin de objetos
Creacin de objetos en Java
En Java los objetos siempre son creados en memoria dinmica Slo hay una forma de crear objetos
... Pozo p; // Aqu no se ha creado el pozo p = new Pozo(1); // Se crea el pozo en memoria
// dinmica
Creacin de objetos
En Java las referencias de los objetos y los valores de tipos primitivos pueden ser almacenados en memoria automtica
int getNextNumber() { int next = 0; return ++next; }
o en memoria esttica
public class SequenceManager { static int next = 0; static int getNextNumber() { return ++next; } }
Creacin de objetos
Creacin de objetos en Objective C
Pozo *p;
Creacin de objetos
Inicializacin
private:
int id; ... public: Cuenta(); Cuenta(int); int getId(); void setId(int idCta); ... };
Creacin de objetos
Inicializacin
... Cuenta::Cuenta() {
id = 0;
} Cuenta::Cuenta(int idCta) {
this->id = idCta;
}
Creacin de objetos
Inicializacin en Java
class Cuenta { private int id;
...
public Cuenta() { } public Cuenta(int idCta) {
this.id = idCta;
} int getId() { return this.id; } ... };
Creacin de objetos
Inicializacin en Java
Creacin de objetos
Inicializacin en Java
Creacin de objetos
Inicializacin en Objective C
}
+(Cuenta *) create: (int) id; -(Cuenta *) init: (int) id; ...
Creacin de objetos
Inicializacin en Objective C
{
self = [super init]; if ( self) { [self setId: idCta]; } return self; }
Creacin de objetos
Inicializacin en Objective C
main() { Cuenta *c;
...
}
Creacin de objetos
Herencia
Composicin
Es posible que existan varias clases con caractersticas similares Por ejemplo, en relacin con un pozo de levantamiento artificial por gas (gaslift) es necesario conocer la presin del gas a la entrada del pozo Esta informacin no es requerida para pozos de flujo natural
Por otra parte, los pozos de flujo natural y los de gaslift comparten caractersticas similares, tales como profundidad del pozo, produccin de crudo, etc
En este caso, en lugar de crear dos clases independientes, es posible definir una jerarqua de clases
Pozo
PozoFlujoNatural
PozoGasLift
Real
Entero
Complejo
EnteroCorto
EnteroLargo
Las subclases heredan las variables y mtodos de las superclases (pero no los valores de las variables)
Las subclases pueden agregar nuevos mtodos, y variables o redefinir los mtodos existentes
Un objeto puede responder a un mensaje que no est definido en su clase si el mtodo est implementado en algunas de las superclases
Clase Pozo
public class Pozo { private int id; private double prodCrudo; private double prodGas;
Clase PozoGasLift
public class PozoGasLift extends Pozo { private double presionEntrada; public void leerValores() { super.leerValores(); presionEntrada = ... } public double getPresion() { return presionEntrada; } }
Cuando se pasa un mensaje a un objeto, la bsqueda del mtodo a ejecutar comienza por la clase del objeto
Si no se encuentra el mtodo en la clase la bsqueda contina hacia arriba en la jerarqua de clases hasta llegar a la raz del rbol
Se ejecuta el primer mtodo encontrado o, si no se encuentra ningn mtodo, se produce un error
Esto ocurre cuando la subclase tiene un mtodo con el mismo nombre que un mtodo de la superclase En el ejemplo anterior, el mtodo leerValores() est definido en la clase Pozo, pero est siendo redefinido en la clase PozoGasLift public void leerValores() { this.prodCrudo = ... this.prodGas = ... }
Refinar mtodos
Para refinar un mtodo se incluye un mtodo con el mismo nombre. La diferencia con respecto a la anulacin es que el nuevo mtodo llama al mtodo correspondiente en la superclase public void leerValores() { super.leerValores(); this.presionEntrada = ... }
Refinar mtodos
this->presionEntrada = ...
}
Especializacin
Ejemplo
Real
Entero
Complejo
EnteroCorto
EnteroLargo
Especificacin
Se desea garantizar que las clases mantengan una interfaz comn La clase paterna especifica el comportamiento que se debe implementar Las clases hijas implementan ese comportamiento
Construccin
Lo opuesto a la especializacin La subclase es ms general que la superclase Generalmente se usa cuando se trabaja con clases que no se pueden modificar o que no se desean modificar En general se debe evitar este tipo de herencia Ejemplo
Ventana VentanaColor
La herencia es una relacin esttica entre clases Cuando una clase hereda de otra la relacin entre las dos clases no vara durante toda la vida del programa Cuando hay una relacin de composicin un objeto de clase A tiene uno o ms objetos de clase B.
Vehculo
Motor
String ao;
Motor motor; ...
}
public class Motor { String modelo;
int potencia;
... }
La composicin puede ser usada como tcnica de reutilizacin de cdigo, al igual que la herencia
Muchos problemas que pueden ser resueltos mediante herencia tambin pueden ser resueltos por composicin
Ejemplo: La clase GraficadorPozos puede tener una variable de clase JComponent (composicin) en lugar de ser subclase de JComponent. El mtodo graficar invoca mtodos de la clase JComponent para mostrar la grfica en pantalla
La composicin es una relacin dinmica La clase a la que pertenece el valor de la variable puede cambiar en tiempo de ejecucin Esto permite mayor flexibilidad que la herencia ya que el comportamiento puede cambiar dinmicamente
Cuando se usa herencia los mtodos siempre pueden hacer referencia al objeto this (el receptor del mensaje). Cuando se usa composicin esto no es posible
La delegacin es similar a la composicin. Hay una clase receptora y una clase delegada La clase receptora tiene un objeto (el delegado) en el cual delega ciertas responsabilidades
Cada mtodo de la clase delegada toma un parmetro del tipo de la clase receptora. Este parmetro hace las veces del objeto this.
Un entero es asignado en algn lugar de la memoria. La vinculacin entre el nombre n y el objeto (el valor entero) se puede hacer:
En tiempo de compilacin - enlace temprano (early binding). El ejemplo anterior En tiempo de ejecucin enlace tardo (late binding).
// C++
La validez de las operaciones Cmo se realizan las operaciones // suma de enteros // suma de punto flotante
int a, b, c; c = a + b z = x + y; double x, y, z;
String a = Hola * x;
Determinar el conjunto de valores legales que pueden contener las variables Determinar la validez y el significado de las operaciones.
Una variable es una caja de bits. El tipo es lo que le da el significado a los bits. El enlace es temprano (en tiempo de compilacin)
Las variables no tienen tipo. Ejemplo en Smalltalk: | x y z | Cada valor es un objeto que pertenece a una clase
x := 10. x := Pozo new: 4.
Asociado a cada valor est la informacin de a qu clase pertenece No existe la idea de asignacin ilegal de valores El enlace es tardo (en tiempo de ejecucin)
El enlace esttico presenta ciertas dificultades cuando se trabaja con jerarquas de clases
Cuando se pasa un mensaje a un objeto el sistema de ejecucin debe:
Verificar la validez de la operacin Determinar cual mtodo se debe ejecutar para satisfacer la solicitud
Ejemplo
Figura
Crculo
Rectngulo
Lnea
Ejemplo
Circulo c; c = new Circulo(100, 100, 50); c.dibujar(); // se ejecuta el mtodo dibujar c.imprimir(); // error, la operacin imprimir // no est definida para Circulos
Esto se debe a que Java utiliza enlace esttico de tipos para determinar la validez de las operaciones
El mtodo dibujar no est definido en la clase Figura
La solucin es declarar en la clase figura todos los mtodos que se implementarn en las subclases
abstract class Figura { private int x; private int y; public Figura(int cx, int cy) { x = cx; y = cy; } void moverA(int cx, int cy) { x = cx; y = cy; } void dibujar(){ // implemenado por las subclases } }
No se pueden crear objetos de clase figura Cualquier subclase de Figura debe implementar el mtodo o ser declarada abstracta
1.abstract class Figura { protected int x; protected int y; public Figura(int cx, int cy) { x = cx; y = cy; } void moverA(int cx, int cy) { x = cx; y = cy; } abstract void dibujar(); 1.}
En C++
Se utiliza el tipo esttico para determinar la validez de la operacin La seleccin del mtodo se puede hacer estticamente o dinmicamente
En Objective C
Enlace en C++
class Figura { Private: int x; int y; public:
Enlace en C++
class Figura { Private: int x; int y; public:
Polimorfismo
Polimorfismo
Un objeto polimrfico es una variable o argumento de funcin que puede tener valores de tipos diferentes durante la ejecucin del programa
Polimorfismo
c.dibujar(); r.dibujar();
Polimorfismo
Otro aspecto del polimorfismo: Funciones que pueden tomar parmetros de cualquier tipo
Ejemplo
ordenar(x)
x puede ser un arreglo de cualquier cosa Unicamente se requiere que los elementos de x respondan al mensaje mayor
x[i].mayor(y)
La respuesta sera un valor booleano que indique si el receptor es mayor que el parmetro. El mtodo mayor tambien es polimrfico (el parmetro y puede ser cualquier cosa)
Polimorfismo
Esto es fcil en lenguajes de programacin 100% orientados a objetos tales como Smalltalk pero difcil de lograr en lenguajes con tipos, tales como C++ y Java
C++ y Java ofrecen caractersticas diseadas para permitir, hasta cierto punto, objetos polimrficos Objective C permite desarrollar al estilo de smalltalk (sin tipos estticos) o al estilo de Java (con tipos estticos)
Polimorfismo
Java
Interfaces Una interfaz es una coleccin de definiciones de mtodos sin las implementaciones. Una interfaz define un protocolo que un objeto se compromete a implementar
Polimorfismo
Suponga que se desea implementar un mtodo imprimir que imprime el valor que se le pasa como parmetro
void imprimir(int v)
{
System.out.println(v); }
Polimorfismo
Polimorfismo
Polimorfismo
Para crear un objeto imprimible la clase del objeto debe implementar la interfaz ObjetoImprimible:
class Pozo implements ObjetoImprimible
{ ...
Polimorfismo
{
double evaluar(double x); } public class OptimizadorMonteCarlo {
FuncionObjetivo func;
int ciclos; double puntoOpt; Optimizador(FuncionObjetivo f, int c) { func = f; ciclos = c; }
Polimorfismo
v=func.evaluar(p);
if (v < min) { min = v; puntoOpt = p; } } return min; }
Polimorfismo
}
} public class Cuadrado implements FuncionObjetivo {
Polimorfismo
Polimorfismo
Generics.
Los Generics en Java son clases o mtodos cuyos tipos estn parametrizados.
Polimorfismo
C++ ofrece las siguientes caractersticas que ayudan a definir objetos polimrficos
Polimorfismo
Herencia mltiple
Window
WindowWithBorder
WindowWithMenu
Clock
Polimorfismo
class Window { ...
public:
Window(char *title); virtual void draw(); };
}
class WindowWithMenu : public Window { // cosas relacionadas con menus void ownDraw(); void draw(); }
Polimorfismo
class Clock : public WindowWithBorder, public windowWithMenu { // cosas relacionadas con relojes void ownDraw () // dibujar agujas y numeros void draw(); }
Polimorfismo
void WindowWithBorder::draw() { Window::draw();
ownDraw();
} void WindowWithMenu::draw() { Window::draw(); ownDraw(); } void Clock::draw() {
Window::draw();
WindowWithBorder::ownDraw(); WindowWithMenu::ownDraw(); }
Polimorfismo
La herencia mltiple presenta problemas de ambigedad cuando dos superclases de una clase tienen mtodos con el mismo nombre
C++ tiene reglas para resolver la ambigedad
Polimorfismo
En C++ se puede implementar el concepto de interfaz utilizando herencia mltiple y mtodos abstractos
class ObjetoImprimible {
virtual char *convertirEnCadena() = 0; };
El mtodo convertirEnCadena no se implementa puesto que es abstracto Cualquier subclase de ObjetoImprimible debe implementar el mtodo convertirEnCadena.
Polimorfismo
Polimorfismo
Template<class T> void Pila<T>::push(T elem) { if (top == 100) exit(1); datos[tope] = elem; tope = tope + 1; } Pila <int> pilaEnt; pilaEnt.push(10); Pila <float> pilaFloat; pilaFloat.push(5.2);
Polimorfismo
Existe una biblioteca de clases estandar basada en templates (STL: standard template library)
Los templates resuelven el problema parcialmente.
La misma clase patrn se puede usar para implementar clases que almacenen diferentes tipos de datos, pero no para que un objeto contenedor pueda contener objetos de tipos diferentes.
Polimorfismo
Objective C
Tipos estticos.
Similar al sistema de tipos de Java Para implementar funciones polimrficas se pueden usar: interfaces (protocols en Objective C) No hay clases parametrizadas
Polimorfismo
Genricos en Java
public class ArrayList<V> { private V[] values; public ArrayList() { values = (V[]) new Object[DEFAULT_SIZE]; }
Polimorfismo
Genricos en Java
}
}
Polimorfismo
Genricos en Java
Uso
public static void main(String[] args) {
ArrayList<int> a = new ArrayList<int>(); a.add(1); // OK
}
}
La definicin de las clases template en C++ no se compilan. Se distribuyen como cdigo fuente
Cuando se declara un objeto cuyo tipo es una clase template el compilador genera una clase con el cdigo fuente de la clase template en la cual el tipo parametrizado se sustituye por el tipo suministrado en la declaracin. Ejemplo
Pila<int> p = new Pila<int>;
double pop();
...
Las dos clases son incompatibles desde el punto de vista de la programacin orientada a objetos
La definicin de las clases genericas en Java. Se compilan como cualquier otra clase. Los tipos parametrizados se sustituyen por Object. Esto lo llaman type erasure porque despus que el programa est compilado no queda ninguna informacin del tipo Cuando se declara una variable con un tipo simplemente se crea una instancia de la nica clase existente. Ejemplo
Pila<int> p = new Pila<int>();
El compilador simplemente crea un objeto de tipo pila. Dado que el tipo de la pila es Object se le puede agregar cualquier cosa. El compilador verifica que no se le agregue algo diferente a int
Pila p1 = p;
p.push(Hola);
En este caso el compilador produce una advertencia (warning) pero el programa compila
En conclusin las clases parametrizadas (template) en C++ producen clases cuyos tipos son verdaderamente enteros, dobles, etc., mientras que las clases genricas en Java producen clases cuyo tipo es siempre Object Las clases parametrizadas en C++ por lo tanto son ms seguras (type safe) y ms eficientes Los diseadores de los genricos en Java justifican sus decisiones argumentando compatibilidad con programas escritos con versiones anteriores a Java 1.5