Académique Documents
Professionnel Documents
Culture Documents
Lenguaje de
Programación Orientado a
Objetos.
Contenido
1. Implementación de Estructuras de Datos
2. Implementación de clases
3. Implementación de asociaciones y
dependencia
4. Implementación de Herencia y Polimorfismo
Estructuras de Datos
Estructuras de datos clásicas
- Ejemplo : un arreglo.
b. Es útil cuando:
-Se quiere recorrer todos los elementos.
- No nos importa el valor del índice.
Colecciones
Sintaxis Bucle for-each
for (tipo variable: estructura){
//código
}
int suma = 0;
List<Integer> arreglo= new ArrayList<Integer>();
…..
for(int elemento:arreglo){
suma += elemento;
}
pro1.java
Colecciones
La interfaz Set
- ¿Cómo la instanciamos?
Colecciones
La interfaz Set
- El new se hace con las clases.
- Pero se guarda en una variable Set.
- Se manipula con los métodos de la interfaz Set
Set <Libreta> conjunto = new TreeSet<Libreta>
Donde Libreta es una clase(tipo de dato) con sus atributos y
métodos propios.
Métodos:
isEmpty() : si la lista esta vacia.
- ¿Qué especificamos?
a. El tipo de colección.
b. El tipo de objeto que contendrá.
30
Implementación de Clases
• La forma de escribir clases es procurando la flexibilidad y facilidad
de mantenimiento.
• Cuando un programador establece variables de instancia locales
(public), no se puede validar los valores asignados, por ejemplo:
33
Implementación de Clases: encapsulación
• Al ocultar los detalles de implementación, se puede
escribir nuevamente el código del método (incluso de
las variables que se utilizan en la clase), sin forzar un
cambio en el código que llama al método modificado.
• Para que el código tenga mantenibilidad, flexibilidad y
extensibilidad, el diseño debe incluir la encapsulación.
• Como incluir encapsulación:
– Mantenga las variables protegidas (Con un modificador de
acceso, con frecuencia se usa private o protected).
– Crear métodos de acceso public, utilizar estos métodos para
acceder directamente a las variables.
– Para los Métodos, utilizar la convención de nomenclatura de
nombres de JavaBeans set <Propiedad> y get <Propiedad>
34
Implementación de Clases: encapsulación
• Los métodos de acceso getters y setters, acceden a las variables de
instancia de las clases.
• El código anterior no parece útil, ya que no realiza ningún tipo de
validación o transformación.
• No se observa el beneficio de usar getter y setter que no agregan
funcionalidad adicional.
• Sin embargo, eso es al inicio, ya que se puede cambiar de forma de
pensar después; y entonces, al agregar más código al método, no
se corrompe su API.
• Un buen diseño orientado a objetos es el que se planea para el
futuro.
• En el ejemplo siguiente, la lógica del método setIzquierda a
perdido la encapsulación.
35
Implementación de Clases: encapsulación
Class Ejemplo {
public int izquierda = 9;
public int derecha = 3;
37
Implementar Clases y Asociaciones
• En un diagrama de clases se inicia programando la clase
menos dependiente, en el diagrama anterior el orden de
programación es el siguiente:
– Chofer (no depende de ninguna clase)
– Taxi (depende de la clase Chofer, por la asociación)
– Prueba (depende las dos clases anteriores)
• La clase Chofer presenta la implementación de la
sobrecarga de métodos (un tipo de polimorfismo), ya
que incluye dos constructores:
– “public Chofer()”, sin argumento, y
– “public Chofer(String nombre)”, con argumento
• Así, un objeto Chofer puede instanciarse sin inicializar su
nombre, o inicializandolo. 38
Implementar Clases y Asociaciones
public class Chofer{ public String getNombre(){
private String nombre; return nombre;
public Chofer(){ }
//constructor sin argumentos public String toString(){
} return “\nNombre del Chofer: “
public Chofer(String nombre){ + nombre;
this.nombre=nombre; }
} }
public void setNombre(String nombre){
this.nombre=nombre;
}
39
Implementar Clases y Asociaciones
• El método toString() convierte un objeto Chofer a su representación en una
cadena String, y es un método heredado de la clase Object.
• El método main muestra tres formas validas de imprimir el objeto de tipo Taxi,
aplicando el método toString(). 43
Implementar Dependencia
• La dependencia es una relación de uso entre dos clases, una clase
usa a la otra.
47
Asociación de multiplicidad 0..*
• La clase Chofer mantiene la misma codificación de los ejemplos
anteriores, pero la clase Taxi quedaría así:
import java.util.ArrayList;
public class Taxi{
private String matricula;
private ArrayList<Chofer> choferes= new ArrayList<Chofer>();
public Taxi(){
//constructor sin argumentos
}
public Taxi(String matricula){
this.matricula=matricula;
}
public void agregarChofer(Chofer chofer){
choferes.add(chofer);
} 48
Asociación de multiplicidad 0..*
public Chofer getChofer(int indice){ //clase Taxi
if (this.getCantidad()>indice)
{
Chofer chofer=choferes.get(indice);
return new Chofer(chofer.getNombre());
} else // posicion invalida
throw new IllegalArgumentException ( "Error: Posicion invalida");
}
public int buscarChofer(Chofer chofer){
return choferes.indexOf(chofer); //devuelve -1 si no esta en la lista
}
public void setChofer(int indice, Chofer chofer){
if (this.getCantidad()>indice)
choferes.set(indice, chofer);
else // posicion invalida
throw new IllegalArgumentException ( "Error: Posicion invalida");
49
}
Asociación de multiplicidad 0..*
public void eliminarChofer(Chofer chofer){ //Clase Taxi
if (choferes.contains(chofer))
choferes.remove(chofer);
else // objeto no existe en la lista
throw new IllegalArgumentException ( "Error: Chofer no existe");
}
public int getCantidad(){
return choferes.size();
}
public void setMatricula(String matricula){
this.matricula=matricula;
}
public String getMatricula(){
return matricula;
}
50
Asociación de multiplicidad 0..*
public String toString(){ //Clase Taxi
String nombres=new String();
for (Chofer chofer:choferes)
nombres=nombres+chofer.toString();
return "Taxi con matricula: " + matricula+" ; " + nombres;
}
}
54
Asociación de multiplicidad 1..*
• El código de la clase import java.util.ArrayList;
Taxi del ejemplo public class Taxi{
anterior (multiplicidad private String matricula;
0..*) permite crear private ArrayList<Chofer>
objetos de tipo Taxi aún choferes= new ArrayList<Chofer>();
sin agregarle ningún //public Taxi(){
objeto de tipo Chofer. // constructor sin argumentos
//}
• Para aplicar la //public Taxi(String matricula){
multiplicidad de 1..* // this.matricula=matricula;
será necesario evitar //}
que se creen objetos de public Taxi(String matricula, Chofer chofer){
tipo Taxi sin al menos this.matricula=matricula;
un objeto de tipo agregarChofer(chofer);
Chofer. }
55
Implementar Clases de Asociación
• Si a un Taxi se le asigna un Chofer en una fecha específica, la fecha
se considera un atributo de la asociación, y será necesario crear
una Clase asociación con el nombre Asignación.
• En este diagrama de
clases, cada objeto de
la clase Taxi podrá
tener asociado uno,
varios o ningún objeto
(0..*) de tipo
Asignación, y cada
objeto de tipo
Asignación deberá
tener asociado un
objeto de tipo Chofer.
56
Implementar Clases de Asociación
• El orden de programación de las clases es el siguiente:
− Chofer
− Asignacion
− Taxi
− Prueba
• Chofer no depende de ninguna clase, Asignación depende de
Chofer, Taxi depende de Asignación, y Prueba depende de Taxi y
Chofer.
• La clase Asignacion, deberá tener una variable de tipo Chofer, para
almacenar un objeto.
• La clase Taxi, tendrá una variable de instancia de tipo Asignacion,
que deberá ser una estructura de datos para almacenar los objetos
(0..*) de tipo Asignación.
• Además, la clase Taxi deberá incorporar métodos necesarios para
manipular la lista de asignaciones.
57
Implementar Clases de Asociación
public class Asignacion{ public String getFecha(){
private String fecha; return fecha;
private Chofer chofer; }
public Asignacion(){ public void setChofer(Chofer){
//constructor sin argumentos this.chofer = chofer;
} }
public Asignacion(String fecha, public Chofer getChofer(){
Chofer chofer){ return chofer;
this. fecha = fecha; }
this.setChofer( chofer); public String toString(){
} return “Fecha de asignación: “ +
public void setFecha(String fecha){ fecha + ” ; chofer: ” +
this. fecha = fecha; chofer.getNombre();
} }
}
58
Implementar Clases de Asociación
import java.util.ArrayList;
public class Taxi{
private String matricula;
private ArrayList<Asignacion> lista= new ArrayList<Asignacion>();
public Taxi(){
//constructor sin argumentos
}
public Taxi(String matricula, String fecha, Chofer chofer){
this.matricula=matricula;
Asignacion a=new Asignacion(fecha,chofer);
agregarAsignacion(a);
}
public void agregarAsignacion(Asignacion a){
lista.add(a);
}
59
Implementar Clases de Asociación
public int getCantidad(){ //Clase Taxi
return lista.size();
}
public Asignacion getAsignacion(int indice){
Asignacion a=lista.get(indice);
return new Asignacion(a.getFecha(), a.getChofer());
}
//incluir aca public void setMatricula(String)
//incluir aca public String getMatricula()
public String toString(){
String nombres=new String();
for (Asignacion a:lista)
nombres=nombres+a.toString();
return “Taxi con matricula: “ + matricula+” ; “ + nombres;
}
60
Implementar Clases de Asociación
public class Prueba{
public static void main(String args[ ]){
Chofer chofer=new Chofer(“Juan”);
Taxi taxi=new Taxi(“P-100100”, “11/08/2014”, chofer);
System.out.println(taxi);
}
}
• La clase Prueba solo usa las clases Taxi y Chofer, no usa la clase
Asignacion.
62
Implementar Asociación Reflexiva
public class Chofer{ public void setSuplente(Chofer
private String nombre; suplente){
private Chofer suplente; this.suplente=suplente;
public Chofer(){ }
} //constructor sin argumentos
public Chofer(String nombre public Chofer getSuplente(){
Chofer suplente){ return suplente;
this.nombre=nombre; }
setSuplente(suplente);
public String toString(){
} return “Nombre del Chofer: “
public void setNombre(String nombre){ + nombre +
this.nombre=nombre; ” ; nombre del suplente: “
} + suplente.getNombre();
public String getNombre(){ }
return nombre; }
}
63
Implementar Agregación
• La agregación es un tipo especial de asociación donde se agrega el
matiz semántico de que la clase de donde parte la relación
representa el “todo” y las clases relacionadas “partes”.
• Realmente, Java y la mayoría de lenguajes orientados a objetos no
disponen de una implementación especial para este tipo de
relaciones. Básicamente se tratan como las asociaciones
ordinarias.
• En algunas ocasiones, la clase que representa el todo, será la
responsable de crear los objetos de las «partes», pero no es
obligatorio.
64
Implementar Agregación
public class Materia{ import java.util.ArrayList;
private String codigo; public class Carrera{
public Materia(){ private String nombre;
//constructor sin argumentos private ArrayList<Materia> materias;
} materias=new ArrayList<Materia>();
public Materia(String codigo){
this.codigo=codigo; public Carrera(){
} //constructor sin argumentos
public void setCodigo(String }
codigo){
this.codigo=codigo; public Carrera(String nombre){
} this.nombre=nombre;
public String getCodigo(){ }
return codigo;
} public void setNombre(String nombre){
public String toString(){ this. nombre=nombre;
return “Codigo: “ + codigo }
}
} 65
Implementar Agregación
//Clase Carrera
public String getNombre (){ public int getCantidad(){
return nombre; return materias.size();
} }
public void agregarMateria(
Materia materia){ public String toString(){
materias.add(materia); String codigos=new String();
}
for each(Materia mat:materias)
codigos=codigos+mat.toString();
public Materia getMateria(
int indice){ return “Nombre de la carrera: “ +
Materia mat; nombre + ” ; Materias: “ +
mat=materias.get(indice); codigos;
}
return new }
Materia(mat.getNombre());
} 66
Implementar Agregación
• La clase Prueba crea dos
objetos de tipo Carrera y
public class Prueba{
dos de tipo Materia.
public static void main(String args[ ]){
Materia mat1=new Materia(«PRN215»);
• Al objeto Carrera de
Materia mat2=new Materia(«PRN315»);
Sistemas se le agregan los
Carrera car1=new Carrera(«Sistemas»);
dos objetos de tipo
Carrera car2=new Carrera(«Industrial»);
Materia, y al objeto
car1.agregarMateria(mat1);
Carrera de Industrial, se
car1.agregarMateria(mat2);
le agrega un objeto de
car2.agregarMateria(mat1);
tipo Materia.
System.out.println(car1);
System.out.println(car2);
• De esa manera, las dos
}
carreras comparten un
}
objeto agregado, la
Materia PRN215. 67
Implementar Composición
• La composición es un tipo de agregación que agrega el matiz de
que la clase “todo” controla la existencia de las clases “parte”.
• Es decir, normalmente la clase “todo” creará al principio las clases
“parte” y al final se encargará de su destrucción.
• Dado el ejemplo siguiente, la clase Cuenta se compone de un
registro de Movimientos, de tal forma que queda constancia tras
cada abono o retiro realizado en la Cuenta.
68
Implementar Composición
public class Cliente{ public class Movimiento{
private String nombre; private String tipo;
public Cliente(){ private double monto;
//constructor sin argumentos public Movimiento(String tipo,
} double monto){
public Cliente(String nombre){ this.tipo=tipo;
this.nombre=nombre; this.monto=monto;
} }
public void setNombre(String public void setTipo(String tipo){
nombre){ this.tipo=tipo;
this.nombre=nombre; }
} public String getTipo(){
public String getNombre(){ return tipo;
return nombre; } //incluir setMonto, getMonto()
} public String toString(){
public String toString(){ return «Tipo: » + tipo + «; Monto: »
return “Nombre: “ + nombre + monto;
} }
} } 69
Implementar Composición
public class Cuenta{ public void abonar(double cant){
private double saldo; Movimiento mov=new Movimiento(
«abono», cant);
private ArrayList<Cliente> propietarios;
listM.add(mov);
propietarios=new ArrayList<Cliente>(); saldo = saldo + cant;
private ArrayList<Movimiento> listaM; }
listaM = new ArrayList<Movimiento>();
public Cuenta(String propietario, public void retirar(double cant){
Movimiento mov=new Movimiento(
double saldo){
«retiro», cant);
Cliente pro=new Cliente(propietario); listM.add(mov);
agregarPropietario(pro); saldo = saldo - cant;
this.nombre = nombre; }
}
public String toString(){
//setSaldo(double saldo)
//Capturar en una variable String
//getSaldo() //saldo, propietarios y
public void agregarPropietario(Cliente //movimientos
prop){ }
propietarios.add(prop); }
} 70
Implementar Composición
import java.util.ArrayList;
public class Cuenta{
private double saldo;
private ArrayList<Cliente> propietarios=new ArrayList<Cliente>();
private ArrayList<Movimiento> listaM = new ArrayList<Movimiento>();
public Cuenta(String propietario, double saldo){
Cliente pro=new Cliente(propietario);
agregarPropietario(pro);
this.nombre = nombre;
}
//incluir setSaldo y getSaldo()