Sie sind auf Seite 1von 173

Tcnicas Avanzadas de Programacin

Contenido

Conceptos generales de programacin orientada a objetos


Concepto de clase, mtodo, mensaje, objeto Ejemplo: un programa para manejo de Pozos

Ocultamiento de informacin
Algunos lenguajes orientados a objeto

Diseo orientado a objetos

Diseo dirigido por responsabilidades


UML (Lenguaje de modelado unificado - unified modeling language)

Contenido

Mecanismos de reutilizacin de cdigo


Herencia Composicin

Delegacin
Tipos parametrizados

Enlace esttico y dinmico

Asignacin esttica y dinmica de tipos


Enlace esttico y dinmico de mtodos

Contenido

Herencia y tipos

Distribucin de la memoria Asignacin y Equivalencia

Conversin de tipos
Herencia de clases y herencia de interfaces

Ocultamiento de informacin

Acoplamiento y cohesin
Control de acceso y visibilidad

Contenido

Polimorfismo

Objetos polimrficos Sobrecarga

Interfaces

Patrones de diseo

Estructura de un patrn de diseo

Patrones creacionales
Patrones estructurales Patrones de comportamiento

Contenido

Programacin con hilos


Concurrencia y paralelismo Hilos y procesos

Modelos de programacin multihilos


Ciclo de vida de un hilo Prioridades

Sincronizacin
Prcticas recomendadas

Acceso a bases de datos

JDBC

Conceptos Generales

Programacin Orientada a Objetos

Los especialistas ven la P.O.O. desde dos puntos de vista


El primero sostiene que la POO es una nueva forma de programar. Un nuevo paradigma

El segundo sostiene que la POO es simplemente una evolucin de tcnicas de programacin ya existentes (tipos de dato abstractos)

Programacin Orientada a Objetos

La programacin orientada a objetos como un nuevo paradigma de programacin

Programacin Orientada a Objetos


Clase Aplicacin
mostrar

Clase Men
mostrar

Clase Factura Factura


Mensaje

App
Mensaje

Menu Receptor
Accin: muestra las opciones del menu

Emisor

Receptor
Accin: Imprime los datos de la factura

Programacin Orientada a Objetos


Algunos conceptos bsicos

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

Programacin Orientada a Objetos

La accin realizada en respuesta a un mensaje depende del receptor del mensaje


Nuevo Abrir Guardar Guardar como

Mostrar

Men

Mostrar

Factura

Fecha: 12/03/00 Cliente: Pedro Prez Cant. Descrip. Monto 1 Lavadora 5000,00 2 ...

Programacin Orientada a Objetos

Clases. Son categoras de objetos


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

Programacin Orientada a Objetos

Para programar en forma orientada a objetos es necesario:


Decidir que objetos se necesitan para resolver un problema Determinar que mtodos implementa cada clase

Si las clases requeridas no estn disponibles ser necesario disearlas


Disear una clase consiste en:

Establecer los mtodos de la clase


Definir las variables internas o variables de estado que tendrn los objetos

Programacin Orientada a Objetos


Ejemplo: un programa de manejo de cuentas de banco

En este ejemplo se presenta una clase Cuenta que puede ser el fundamento para un programa de manejo de cuentas

En primer lugar se presenta la definicin de la clase, incluyendo la implementacin de los mtodos.


Luego se presenta la forma de utilizar la clase, es decir:

Como crear una Cuenta


Como pasar mensajes a una Cuenta

El ejemplo est implementado en Java

Programacin Orientada a Objetos

Declaracin de la clase Cuenta

setNombre(String nombre) {

package cuentas; public class Cuenta { private int id;

this.nombre = nombre;
} public double getSaldo(){ return saldo; }

private String nombre;


private double saldo; public Cuenta() { } public int getId() {

public void depositar(double


cantidad) { this.saldo += cantidad; } public boolean retirar(double cantidad) { if (cantidad > this.saldo) { saldo -= cantidad; return true;

return id;
} public void setId(int id) { this.id = id; } public String getNombre() { return nombre; } }

}
return false; }

Programacin Orientada a Objetos


Elementos que constituyen una clase

Declaracin de la clase

Contiene el nombre de la clase y otros atributos

Variables

Las variables definen el estado del objeto

Mtodos

Los mtodos son procedimientos que se ejecutan cuando se pasa un mensaje a la clase

Constructores

Son procedimientos que permiten inicializar el objeto

Programacin Orientada a Objetos


Como usar la clase Cuenta
// Como crear una cuenta Cuenta c; c = new Cuenta(3); // Como pasar mensajes a una cuenta c.depositar(10000); int saldo = c.getSaldo(); System.out.println(saldo);

Programacin Orientada a Objetos

Estructura de un mensaje

c.setId(2);
receptor del mensaje mensaje argumentos

Programacin Orientada a Objetos


public class Carta { public static final int ROJO=0; public static final int NEGRO=1; private int pinta; private int valor; } public int getColor() { if (pinta==CORAZON || pinta==DIAMANTE) { public int getValor() { return this.valor;

public Carta(int p, int v) {


this.pinta = p; this.valor = v; } public int getPinta() { return this.pinta; } } }

return ROJO;

else {

return NEGRO;
}

Programacin Orientada a Objetos

La programacin orientada a objetos como evolucin de tcnicas preexistentes


Los programas se hacen ms complejos en la medida que su tamao aumenta La complejidad se debe principalmente a la interconexin entre diferentes partes del programa Tcnicas para el manejo de la complejidad

Procedimientos. Mdulos.

Tipos de dato abstracto.


Programacin orientada a objetos.

Programacin Orientada a Objetos

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.

Programacin Orientada a Objetos

Ejemplo: implementacin de una pila en C y C++


main() { struct pila p; push(&p, 10); x = pop(&p);

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
}

Programacin Orientada a Objetos

Ejemplo: implementacin de una pila en C y C++


public static void main(String[] args) { Pila p = new Pila();

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--]); } } }

p.push(10); x = p.pop(); p.valores[5]=10


}

//error

Programacin Orientada a Objetos

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

Los mtodos son funciones miembro


En el diseo de un programa se pueden mezclar tipos definidos por el usuario con programacin convencional (no orientada a objetos) Los tipos definidos por el usuario son una herramienta ms (aunque muy importante) entre las que el programador puede escoger para resolver problemas

Programacin Orientada a Objetos


Encapsulamiento y ocultamiento de la informacin

Quin invoca un mtodo de un objeto mediante un mensaje no tiene que saber lo que hace el objeto para satisfacer la solicitud

No se debe acceder directamente a las variables internas de un objeto


Los lenguajes de programacin difieren en el soporte que dan al ocultamiento de la informacin

Programacin Orientada a Objetos


Encapsulamiento y ocultamiento de la informacin
Cuenta c = new Cuenta(); c.id = 2;

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

Programacin Orientada a Objetos


Encapsulamiento y ocultamiento de la informacin

La forma correcta de modificar el identificador de la cuenta es invocando un mtodo diseado para ese fin

Cuenta c = new Cuenta();

c.setId(2);

Programacin Orientada a Objetos


Encapsulamiento y ocultamiento de la informacin

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

public. Se puede acceder al elemento desde cualquier parte del programa

Programacin Orientada a Objetos


Encapsulamiento y ocultamiento de la informacin

En general deben ser privados siempre:

Las variables de instancia

Mtodos que son invocados por otros mtodos de la misma clase y que no deben ser invocados externamente

Deben ser pblicos

Los constructores y mtodos que sern invocados por otras clases

Pueden ser pblicos o privados

Las constantes

Programacin Orientada a Objetos


Encapsulamiento y ocultamiento de la informacin

Pueden ser protected

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.

Cuando usar package

Package se puede usar en lugar de protected para permitir que subclases accedan a las variables de instancia de las superclases.

En ese caso las subclases deben estar en el mismo paquete

Programacin Orientada a Objetos


Encapsulamiento y ocultamiento de la informacin

En C++

Existe private, public y protected

En smalltalk

No existen modificadores, todas las variables son privadas y todos los mtodos son pblicos

Programacin Orientada a Objetos


Algunos lenguajes orientados a objetos

Smalltalk

Un lenguaje 100% orientado a objetos

El lenguaje incluye en su definicin bsica el mecanismo de mensajes


Todo lo dems se logra mediante una biblioteca de clases

No hay tipos de datos. Las variables no tienen tipo


Los valores que contienen las variables son objetos que pertenecen a una clase Es un lenguaje interpretado, lo que lo hace menos eficiente que lenguajes compilados, tales como C y Pascal

Programacin Orientada a Objetos

C++, Object Pascal

Lenguajes hbridos que combinan programacin convencional con P.O.O.

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

Programacin Orientada a Objetos

Java

Sintaxis similar al C++ Lenguaje fuertemente orientado a objetos. (No 100 %)

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

Diseo Orientado a Objetos

Diseo Orientado a Objetos

El primer paso en el diseo orientado a objetos consiste en determinar

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

Diseo Orientado a Objetos


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)

Diseo Orientado a Objetos

Para el diseo se recomienda usar fichas


Cada clase es descrita por separado en una ficha Nombre de la clase Responsabilidades Colaboradores

Diseo Orientado a Objetos

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

Diseo Orientado a Objetos

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

Diseo Orientado a Objetos

Ejemplos de nombres de clase:


LeerValores // No recomendable. No es un sustantivo

// Los nombres de clases deben ser


sustantivos M20 // No sugiere lo que representa la clase // Nombre adecuado // Nombre adecuado

ManejadorCuentas manejador_cuentas

Diseo Orientado a Objetos


Categoras de clases

Las clases se pueden agrupar en categoras segn el tipo de responsabilidades que tienen

Clases manejadoras de datos


Fuentes de datos o pozos de datos Clases de vista o visualizacin

Clases auxiliares

Diseo Orientado a Objetos


Clases manejadoras de datos

Son clases cuya responsabilidad principal es mantener cierta informacin

Por ejemplo en un juego de cartas la clase Carta es un manejador de datos


En un programa de contabilidad una clase Cuenta es un manejador de datos Las clases manejadoras de datos generalmente son los bloques fundamentales de un diseo

Diseo Orientado a Objetos

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

Diseo Orientado a Objetos

nicamente el manejador de datos debe acceder a la informacin que le pertenece


Manejador de Cuentas

Procesador Transacciones

ObtenerSaldo(100)

Manejador Cuentas
LeerCuenta(100)

leerCuenta(100) Archivo de cuentas

Diseo Orientado a Objetos


Fuentes de datos de datos

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

Abrir un archivo en disco


Leer y escribir datos al archivo Cerrar el archivo

Diseo Orientado a Objetos

Una fuente de datos no es duea de los datos


Manejador facturas LeerRegistro Manejador Archivos Manejador Cuentas LeerRegistro

Archivo de facturas

Archivo de cuentas

Diseo Orientado a Objetos


Clases de vista o visualizacin

Son clases que permiten mostrar o visualizar informacin en un dispositivo de salida

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

Diseo Orientado a Objetos


Ejemplo:

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

Diseo Orientado a Objetos


Caso de estudio: Una aplicacin de supervisin de pozos

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.

Diseo Orientado a Objetos


Clases

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

Diseo Orientado a Objetos

Tarjeta CRC de la clase Formulario

Formulario

Graficador Pozos

Pedir al usuario la lista de pozos que se desean graficar

Solicitar al graficador de pozos que despliegue la grfica

Diseo Orientado a Objetos

Tarjeta CRC de la clase GraficadorPozos

GraficadorPozos

Pozo

Crear los pozos con los identificadores de pozos recibidos del Formulario Solicitar a cada pozo la produccin de crudo y de gas

Crear el grfico con la informacin obtenida

Diseo Orientado a Objetos

Tarjeta CRC de la clase Pozo

Pozo

BaseDatos

Leer los datos del pozo al cual representa Mantener los datos del pozo Devolver la produccin de crudo y gas

Diseo Orientado a Objetos

Tarjeta CRC de la clase BaseDatos

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

Diseo Orientado a Objetos

Otro ejemplo: un programa para cajeros automticos


El programa debe

Mostrar un mensaje de bienvenida a los usuarios

Esperar a que se introduzca una tarjeta


Leer el id de la cuenta de la tarjeta Solicitar al usuario que introuzca la clave

Verificar si la clave es correcta


Presentar al usuario un men de opciones (retiro, consulta, ...) Realizar la operacin solicitada y actualizar la cuenta

Entregar el dinero

Diseo Orientado a Objetos

Tarjeta CRC de la clase LectorDeTarjetas

LectorDeTarjetas

Verificador DeClave

Mostrar mensaje, esperar tarjeta

Pedir el Verificador de clave que compruebe validez


LLamar al selector de actividad

SelectorDe Actividad

Devolver Tarjeta

Diseo Orientado a Objetos

Tarjeta CRC de la clase LectorDeTarjetas

VerificadorDeClave Recibir clave del ManejadorDeCuenta.

ManejadorD eCuenta

Verificar si existe la cuenta


Presentar ventana de solicitud de clave Recibir clave del usuario Comparar claves y devolver el resultado.

Diseo Orientado a Objetos

Tarjeta CRC de la clase LectorDeTarjetas

ManejadorDeCuenta Verificar validez de cuenta y devolver la clave

ManejadorD eCuenta

Verificar informacin de retiro y depsito.

Diseo Orientado a Objetos

Tarjeta CRC de la clase LectorDeTarjetas

SelectorDeActividad

ManejadorDe Depsitos

Mostrar men de actividades

Esperar seleccin del usuario


Llamar al manejador de transaccin apropiado

ManejadorDe Retiros

Diseo Orientado a Objetos

Tarjeta CRC de la clase LectorDeTarjetas

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

Diseo Orientado a Objetos

Tarjeta CRC de la clase LectorDeTarjetas

CajaElectrnica

Dar efectivo Dar sobre de depsito Recuperar sobre de depsito

Diseo Orientado a Objetos


Unified Modeling Language (UML)

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

Diseo Orientado a Objetos

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 clases (modelo estructural) Diagramas de objetos (modelo de interaccin)

Diagramas de secuencia
Use cases (casos de uso)

Diseo Orientado a Objetos


Modelo estructural

Una vista de un sistema que hace nfasis en la estructura de los objetos, incluyendo sus clasificadores, relaciones, atributos y operaciones

Diseo Orientado a Objetos


Diagrama de clases

Un diagrama de clases contiene representaciones de clases y relaciones entre clases

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

Diseo Orientado a Objetos

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

Diseo Orientado a Objetos


Relaciones

UML permite definir varios tipos de relacin entre clases. A continuacin se enumeran algunos

Asociacin
Agregacin Composicin

Generalizacin

Diseo Orientado a Objetos


Asociaciones

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)

Diseo Orientado a Objetos

A continuacin se presentan algunos ejemplos de multiplicidad

* 1..* 1..40

T
T

Cero o ms (muchos) Uno o ms Entre uno y 40

T T

Exactamente 5

Diseo Orientado a Objetos

Ejemplos adicionales
Emplea

Empresa

*
Patrono

1..*
Empleado

Persona

Empresa

*
Patrono

1..*
Empleado

Persona

Contrato

Diseo Orientado a Objetos


Agregacin

Es un tipo especial de asociacin que describe una relacin todoparte

Ejemplo

Universidad

1..* Tiene

Facultad

Diseo Orientado a Objetos

Composicin
La composicin es un forma de agregacin que implica una fuerte relacin de propiedad

Avin

1
Fuselaje

1
TrenAterrizaje

2
Motor

Diseo Orientado a Objetos

Composicin

Avin Motor 2

Fuselaje 1
TrenAterrizaje 1

Diseo Orientado a Objetos


Generalizacin

Es una relacin entre una clase general y una clase ms especfica Ejemplo

Empleado

Gerente

Vendedor

Diseo Orientado a Objetos

Diagrama de clases UML correspondiente a la aplicacin de ejemplo

Formulario Pozos

BaseDatos

1
tiene 1 1 1..* tiene

1
1

Graficador Pozos

tiene

Pozo

Diseo Orientado a Objetos

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

Organizacin de la memoria de un programa

Memoria automtica (Pila)

Memoria dinmica (Montculo heap)

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

Por ejemplo, en C++


Pozo pozo;

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

Al declarar una variable de un tipo correspondiente a una clase


...

Pozo p(2);

// se ha creado un pozo

En este caso el objeto se puede crear en memoria estfica o dinmica

Se puede crear un objeto en memoria dinmica mediante el operador new


Pozo *p; // aqu no se ha creado el pozo // dinmica

p = new Pozo(2); // se crea el pozo en memoria

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

Los objetos son destruidos automticamente mediante un recolector de basura

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

Los objetos siempre se crean en memoria dinmica


...

Pozo *p;

// Aqu no se ha creado el pozo


// dinmica

p = [ Pozo alloc ]; // Se crea el pozo en memoria

Creacin de objetos
Inicializacin

Java y C++ tienen un mecanismo de inicializacin automtico conocido como constructores

Los constructores son mtodos con el mismo nombre que la clase


... class Cuenta {

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

Tambin se pueden usar mtodos de clase


class Cuenta { private int id; ... private Cuenta() { } public static Cuenta crear(int idCta) { Cuenta cta = new Cuenta(); cta.id = idCta; } ... };

Creacin de objetos
Inicializacin en Java

Tambin se pueden usar mtodos de clase


... Cuenta c = Cuenta.crear(10); ...

Creacin de objetos
Inicializacin en Objective C

No hay constructores. Se usan mtodos de inicializacin y mtodos de clase (factory methods)


@interface Cuenta : Object
{ int idCuenta; char nombre[20]; double saldo;

}
+(Cuenta *) create: (int) id; -(Cuenta *) init: (int) id; ...

Creacin de objetos
Inicializacin en Objective C

No hay constructores. Se usan mtodos de inicializacin y mtodos de clase (factory methods)


+(Cuenta *) create: (int) idCta {

Cuenta *c = [ [ Cuenta alloc ] init: idCta ];


return c; } -(Cuenta *) init: (int) idCta

{
self = [super init]; if ( self) { [self setId: idCta]; } return self; }

Creacin de objetos
Inicializacin en Objective C
main() { Cuenta *c;

c = [ Cuenta alloc ] init: 10 ];


c = [ Cuenta create: 20 ]; [ c depositar: 1500.0 ];

...
}

Creacin de objetos

Objetos en el montculo y objetos en la pila


Asignacin Verificacin de igualdad Constructures de copia en C++

Mecanismos de Reutilizacin de Cdigo

Mecanismos de Reutilizacin de Cdigo

Herencia
Composicin

Mecanismos de Reutilizacin de Cdigo


Herencia

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

Mecanismos de Reutilizacin de Cdigo


Herencia

En este caso, en lugar de crear dos clases independientes, es posible definir una jerarqua de clases

Pozo

PozoFlujoNatural

PozoGasLift

Mecanismos de Reutilizacin de Cdigo


Herencia

Es posible construir jerarquas de clases ms complejas


Nmero

Real

Entero

Complejo

EnteroCorto

EnteroLargo

Mecanismos de Reutilizacin de Cdigo


Herencia

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

Mecanismos de Reutilizacin de Cdigo

Clase Pozo
public class Pozo { private int id; private double prodCrudo; private double prodGas;

public void leerValores() { ... }


public double getProdCrudo() { return this.prodCrudo; } public double getProdGas() { return this.prodGas; } }

Mecanismos de Reutilizacin de Cdigo

Clase PozoGasLift
public class PozoGasLift extends Pozo { private double presionEntrada; public void leerValores() { super.leerValores(); presionEntrada = ... } public double getPresion() { return presionEntrada; } }

Mecanismos de Reutilizacin de Cdigo


Herencia

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

Mecanismos de Reutilizacin de Cdigo


Ejemplo
PozoGaslift pozo; pozo = new PozoGasLift(); // Se ejecuta el mtodo devolver presin // de la clase PozoGasLift double presion = pozo.getPresion(); // Se ejecuta el mtodo get produccin // de crudo de la clase Pozo int prod = pozo.getProdCrudo(); // error, el mtodo imprimir no est definido pozo.imprimir()

Mecanismos de Reutilizacin de Cdigo


Anulacin y refinamiento de mtodos

Una clase que hereda de otra puede:

Agregar nuevas variables o mtodos Redefinir o anular un mtodo Refinar un mtodo

Mecanismos de Reutilizacin de Cdigo

Redifinir o anular un mtodo

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 = ... }

Mecanismos de Reutilizacin de Cdigo

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 = ... }

Mecanismos de Reutilizacin de Cdigo

Refinar mtodos

En C++ public void leerValores() { Pozo::leerValores();

this->presionEntrada = ...
}

Mecanismos de Reutilizacin de Cdigo


Categoras o tipos de herencia

Especializacin

Es el uso ms comn de herencia

La clase derivada es ms especializada que la superclase


Nmero

Ejemplo

Real

Entero

Complejo

EnteroCorto

EnteroLargo

Mecanismos de Reutilizacin de Cdigo

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

Construir un concepto a partir de otro


Ejemplo: La clase GraficadorPozo puede ser subclase de la clase JComponent de Java Swing. En muchos casos se puede usar composicin en lugar de construccin

Mecanismos de Reutilizacin de Cdigo


Generalizacin

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

Mecanismos de Reutilizacin de Cdigo


Composicin

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

Mecanismos de Reutilizacin de Cdigo


Composicin
public class Vehiculo { String modelo;

String ao;
Motor motor; ...

}
public class Motor { String modelo;

int potencia;
... }

Mecanismos de Reutilizacin de Cdigo


Composicin

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

Mecanismos de Reutilizacin de Cdigo


Composicin

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

Mecanismos de Reutilizacin de Cdigo


Delegacin

La composicin tiene la siguiente desventaja

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.

Enlace Esttico y Dinmico

Enlace Esttico y Dinmico

Enlace (binding): vincular un nombre con el objeto que denota


static int n = 10; // C++

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).

int *n = new int(10);

// C++

Las funciones o subrutinas tambin pueden tener enlace temprano o tardo

Enlace Esttico y Dinmico


El enlace implica determinar

Donde est el objeto en la memoria Qu es el objeto?. Para poder determinar:


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;

El enlace puede ser esttico o dinmico

Enlace Esttico y Dinmico


Enlance esttico. Asignacin esttica de tipos (C++, Java, Objective C, Object Pascal): Se asigna un tipo a cada variable.
int x;

El tipo se usa para

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)

Enlace Esttico y Dinmico


Enlace dinmico (Objective C, Smalltalk, Python, Ruby):

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)

Enlace Esttico y Dinmico

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

Enlace Esttico y Dinmico

Ejemplo

Figura

Crculo

Rectngulo

Lnea

Enlace Esttico y Dinmico


public class Figura { protected int x; protected int y; public Figura(int cx, int cy) { x = cx; y = cy; } public void moverA(int cx, int cy) { x = cx; y = cy; } }

Enlace Esttico y Dinmico


class Circulo extends Figura { protected int radio; public Circulo(int cx, int cy, int r) { super(cx, cy); radio = r; } void dibujar() { // dibujar el circulo } }

Enlace Esttico y Dinmico

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

Enlace Esttico y Dinmico


Ejemplo
Figura f;

Circulo c = new Circulo(100, 100, 50);


f = c;

El tipo de f es Figura, pero el valor al cual se refiere es un Circulo


En este caso se dice que Figura es el tipo esttico y Circulo es el tipo dinmico

Enlace Esttico y Dinmico

Si intentamos realizar una operacin definida para crculos se produce un error


f.dibujar();// error, esta operacin no est
// definida para figuras

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

Enlace Esttico y Dinmico

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 } }

Enlace Esttico y Dinmico

Al declarar abstracto el mtodo dibujar:


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.}

Enlace Esttico y Dinmico


En Java

Se utiliza el tipo esttico para determinar la validez de la operacin


Se utiliza el tipo dinmico para determinar cual mtodo se va a ejecutar para satisfacer la solicitud

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

Hay enlace esttico al estilo de Java y dinmico al estilo de Smalltalk

Enlace Esttico y Dinmico

Enlace en C++
class Figura { Private: int x; int y; public:

Figura(int cx, int cy);


void moverA(int cx, int cy); void dibujar(); // enlace esttico

Enlace Esttico y Dinmico

Enlace en C++
class Figura { Private: int x; int y; public:

Figura(int cx, int cy);


void moverA(int cx, int cy); virtual void dibujar(); // enlace dinmico

Enlace Esttico y Dinmico

En C++ se pueden declarar mtodos abstractos


class Figura { protected: int x; int y; public:

Figura(int cx, int cy);


void moverA(int cx, int cy); virtual void dibujar() = 0; // mtodo abstracto

Polimorfismo

Polimorfismo

El trmino polimorfismo se refiere a conceptos diferentes, pero relacionados


Se habla de polimorfismo cuando un mismo nombre sirve para invocar operaciones diferentes
int a, b; a = b + 5; float a, b; a = b + 5.0; // suma de punto flotante // suma de enteros

Un objeto polimrfico es una variable o argumento de funcin que puede tener valores de tipos diferentes durante la ejecucin del programa

Polimorfismo

La POO permite implementar de manera directa la primera acepcin de polimorfismo


El mtodo que se ejecuta en respuesta a un mensaje depende de la clase del receptor
Rectangulo r; Circulo c; // se ejecuta Circulo::dibujar() // se ejecuta Rectangulo::dibujar()

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

Se dice que un objeto implementa una interfaz

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); }

En este caso imprimir solo puede trabajar con valores enteros

Polimorfismo

Para resolver este problema se define una interfaz ObjetoImprimible:


interface ObjetoImprimible
{ String convertirEnCadena();

El mtodo convertirEnCadena devuelve la representacin del objeto como un string.

Polimorfismo

Ahora se puede declarar el mtodo imprimir como sigue:

void imprimir(ObjetoImprimible v) { String s = v.converirEnCadena(); System.out.println(s); }

Polimorfismo

Para crear un objeto imprimible la clase del objeto debe implementar la interfaz ObjetoImprimible:
class Pozo implements ObjetoImprimible
{ ...

public string convertirEnCadena() {


... } ... }

Polimorfismo

Ejemplo: un programa de optimizacin


import java.util.Random; interface FuncionObjetivo

{
double evaluar(double x); } public class OptimizadorMonteCarlo {

FuncionObjetivo func;
int ciclos; double puntoOpt; Optimizador(FuncionObjetivo f, int c) { func = f; ciclos = c; }

Polimorfismo

Ejemplo: un programa de optimizacin


// Iterar por el numero de ciclos especificados // y devolver el valor minimo obtenido public double optimizar() {

double min = 100000;


Random rnd = new Random(); double v, p; for (int n=0; n < ciclos; ++n) { p = rnd.nextDouble()*10;

v=func.evaluar(p);
if (v < min) { min = v; puntoOpt = p; } } return min; }

Polimorfismo

Ejemplo: un programa de optimizacin


// devolver el punto donde se encontro el valor mnimo public double puntoOptimo() { return puntoOpt;

}
} public class Cuadrado implements FuncionObjetivo {

public double evaluar(double x)


{ return x*x; } }

Polimorfismo

Ejemplo: un programa de optimizacin


// Crear una funcin objetivo y un optimizador Cuadrado cuadrado = new Cuadrado();

Optimizador optimizador = new Optimizador(cuadrado, 100);


// Realizar la optimizacin valorOptimo = optimizador.optimizar(); puntoOptimo = optimizador.puntoOptimo();

Polimorfismo
Generics.

Los Generics en Java son clases o mtodos cuyos tipos estn parametrizados.

Volveremos a este tema despus de haber visto templates en C++

Polimorfismo

C++ ofrece las siguientes caractersticas que ayudan a definir objetos polimrficos

Mtodos estticos y virtuales


Herencia mltiple Patrones (templates)

Polimorfismo
Herencia mltiple

Una clase puede ser subclase de dos clases diferentes

Window

WindowWithBorder

WindowWithMenu

Clock

Polimorfismo
class Window { ...

public:
Window(char *title); virtual void draw(); };

class WindowWithBorder : public Window {


// cosas relacionadas con bordes void ownDraw(); 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

Plantillas. Son clases parametrizadas


template<class T> class Pila { }; int tope; T datos[100]; public: Pila(); void push(T); T pop();

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

Enlace totalmente dinmico.

No hay tipos de dato

Una funcin o mtodo puede recibir parmetros de cualquier tipo


La implementacin de funciones polimrficas es directa Programacin propensa a errores

Programas difciles de entender en el futuro

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

Similar en concepto a los templates en C++ Muy diferente la implementacin

public class ArrayList<V> { private V[] values; public ArrayList() { values = (V[]) new Object[DEFAULT_SIZE]; }

Polimorfismo
Genricos en Java

Similar en concepto a los templates en C++ Muy diferente la implementacin


... public V get(int index) { return values[index] } public void add(V value) {

public class ArrayList<V> {

}
}

Polimorfismo
Genricos en Java

Uso
public static void main(String[] args) {
ArrayList<int> a = new ArrayList<int>(); a.add(1); // OK

public class Test {

a.add(new Integer(1)); // igual a la anterior


// autoboxing a.add(Hola) // error

}
}

Diferencias entre los genricos de Java y los Templates de C++

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>;

El compilador genera la siguiente clase


class PilaInt { int valores[100]; int pop(); ...

Diferencias entre los genricos de Java y los Templates de C++

Si se declara una variable con otro tipo


Pila<double> p = new Pila<double>;

El compilador genera una clase totalmente diferente a la anterior:


class PilaDouble { double valores[100];

double pop();
...

Las dos clases son incompatibles desde el punto de vista de la programacin orientada a objetos

Diferencias entre los genricos de Java y los Templates de C++

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

Diferencias entre los genricos de Java y los Templates de C++

Sin embargo se puede hacer lo siguiente:


Pila<int> p = new Pila<int>();

Pila p1 = p;
p.push(Hola);

En este caso el compilador produce una advertencia (warning) pero el programa compila

Diferencias entre los genricos de Java y los Templates de C++

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

Das könnte Ihnen auch gefallen