Download Paquetes

Document related concepts
no text concepts found
Transcript
Paquetes
Amparo López Gaona
Septiembre de 2008
Amparo López Gaona ()
Paquetes
Septiembre de 2008
1/1
Introducción
La biblioteca de clases de Java es muy grande (cientos de clases).
Está organizada en paquetes
Un paquete es un conjunto de clases, generalmente relacionadas entre
sı́ de alguna manera.
Los nombres de los paquetes son palabras separadas por puntos y se
almacenan en directorios que coinciden con esos nombres.
java.lang Fundamental para el lenguaje. Incluye clases como
Object, Thread, Exception, System y String, las envolturas,
interfaces como Comparable, etc.
java.util Contiene colecciones de datos y clases.
java.io Para la entrada y salida a través de flujos de datos.
java.applet Para crear applets.
java.awt y javax.swing Para crear interfaces con el usuario.
java.sql Paquete que contiene el JDBC, para conexión de
programas Java con Bases de datos.
...
Amparo López Gaona ()
Paquetes
Septiembre de 2008
2/1
Problema
Se desea crear un sistema de ayuda psicológica por Internet.
public class AyudaPsicologica {
private InOut lector;
private Psicologo freud;
public AyudaPsicologica() {
lector = new InOut();
freud = new Psicologo();
}
public void sesion() {
boolean seAcabo = false;
imprimeSaludo();
while(!seAcabo) {
String entrada = lector.readString().trim().toLowerCase();
if(entrada.startsWith("adios")) {
seAcabo = true;
} else {
String respuesta = freud.generaRespuesta();
System.out.println(respuesta);
}
}
imprimeDespedida();
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
4/1
Problema
private void imprimeSaludo() {
System.out.println("Bienvenido al sistema de salud mental \"Fraiser Crane\" ");
System.out.println();
System.out.println("Te puedo ayudar con el problema que tengas.");
System.out.println("Por favor, cuentamelo.");
System.out.println("Para terminar la sesi’on, teclea ’adios’.\n");
}
private void imprimeDespedida() {
System.out.println("Gracias por comunicarte. Espero haber sido de ayuda. Hasta pronto.");
}
public static void main(String [] pps) {
AyudaPsicologica ayudaP = new AyudaPsicologica();
ayudaP.sesion();
}
}
public class Psicologo {
public Psicologo() { }
public String generaRespuesta() {
return "Eso suena interesante. Continua ...";
}
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
6/1
Solución 2
public class AyudaPsicologica {
private InOut lector;
private Psicologo freud;
public AyudaPsicologica() {
lector = new InOut();
freud = new Psicologo();
}
public void sesion() {
boolean seAcabo = false;
imprimeSaludo();
while(!seAcabo) {
String entrada = lector.readString().trim().toLowerCase();
if(entrada.startsWith("adios")) {
seAcabo = true;
} else {
String respuesta = freud.generaRespuesta();
System.out.println(respuesta);
}
}
imprimeDespedida();
}
private void imprimeSaludo() {
System.out.println("Bienvenido al sistema de salud mental \"Fraiser Crane\" ");
System.out.println();
System.out.println("Te puedo ayudar con el problema que tengas.");
System.out.println("Por favor, cuentamelo.");
System.out.println("Para terminar la sesi\penalty \@M \hskip \z@skip \unhbox \voidb@x \bgroup \let \unh
}
private void imprimeDespedida() {
System.out.println("Gracias por comunicarte. Espero haber sido de ayuda. Hasta pronto.");
}
Amparostatic
López Gaona
()
Paquetes
Septiembre de 2008
8/1
public
void main(String
[] pps) {
... Solución 2
import java.util.Random;
public class Psicologo {
private Random aleatorio;
private String [] respuestas;
public Psicologo() {
aleatorio = new Random();
respuestas = new String[10];
llenarRespuestas();
}
public String generaRespuesta() {
int indice = aleatorio.nextInt(respuestas.length); // int indice = (int) Math.random() *10;
return respuestas[indice];
}
private void llenarRespuestas() {
respuestas[0] = "Suena complicado. Podrias describir el problema con m\penalty \@M \hskip \z@skip \unhb
respuestas[1] = "No habia tenido un caso igual. Por favor sigue...";
respuestas[2] = "Suena interesante. Continua ...";
respuestas[3] = "Necesito m’as informaci’on.";
respuestas[4] = "Seguro se soluciona pronto,\nDime que piensas...";
respuestas[5] = "Debes esforzarte un poco m\’as para poder mejorar\n De acuerdo?";
respuestas[6] = "Lo que me cuentas es muy vago. Dame m\’as detalles ...";
respuestas[7] = "Eso no es un problema, es un reto que te har\’a crecer!";
respuestas[8] = "Continua ...";
respuestas[9] = "En estos casos ese tipo de problemas siempre aparece. \nVamos a centrarnos en una part
}
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
10 / 1
Solución 3
import java.io.IOException;
import java.util.HashSet;
public class AyudaPsicologica {
private Lector lector;
private Psicologo freud;
public AyudaPsicologica() {
lector = new Lector();
freud = new Psicologo();
}
public void sesion() {
boolean seAcabo = false;
imprimeSaludo();
while(!seAcabo) {
try {
HashSet entrada = lector.obtenerEntrada();
if(entrada.contains("adios")) {
seAcabo = true;
} else {
String respuesta = freud.generaRespuesta(entrada);
System.out.println(respuesta);
}
} catch (IOException e) { System.err.println("exception:"+e); }
}
imprimeDespedida();
}
private void imprimeSaludo() {
// Igual que antes
}
private void imprimeDespedida() {
// Igual que antes
}
public static void main(String [] pps) {
AyudaPsicologica ayudaP = new AyudaPsicologica();
ayudaP.sesion();
Paquetes
} Amparo López Gaona ()
Septiembre de 2008
12 / 1
... Solución 3
import
import
import
import
java.util.HashMap;
java.util.Set;
java.util.Iterator;
java.util.Random;
//import java.util.*
public class Psicologo {
private HashMap mapaRespuestas;
// MApa para las respuestas
private Random aleatorio;
private String [] respuestaOmision; // Arreglo con las respuestas por omision
public Psicologo() {
mapaRespuestas = new HashMap();
respuestaOmision = new String[10];
llenarRespuestasOmision();
llenarMapaRespuestas();
aleatorio = new Random();
}
public String generaRespuesta(Set palabras) {
Iterator it = palabras.iterator();
while(it.hasNext()) {
String palabra = (String)it.next();
String respuesta = (String) mapaRespuestas.get(palabra);
if(respuesta != null) {
return respuesta;
}
}
return tomaUnaRespuestaOmision();
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
14 / 1
... Solución 3
private void llenarMapaRespuestas()
{
mapaRespuestas.put("triste", "Porque estas triste?\n "+
"No debes sentirte triste porque eso evita sear objetivo\n" +
"trata de superarlo haciendo cosas que te hagan feliz.");
mapaRespuestas.put("tristeza",
"La tristeza es muy mala, recuerda que todo tiene su lado bueno y asi podras superar m\
mapaRespuestas.put("gorda",
"Es normal sentirse gorda en esa situacion.\n" +
"Recuerda que la belleza interna es lo mas importante." +
"De cualquier forma no esta de mas hacer ejercicio");
}
private void llenarRespuestasOmision()
{
respuestaOmision[0] = "Suena complicado. Podrias describir el problema con mas detalle?";
respuestaOmision[1] = "No habia tenido un caso igual. Por favor sigue...";
respuestaOmision[2] = "Suena interesante. Continua ...";
respuestaOmision[3] = "Necesito mas informacion.";
respuestaOmision[4] = "Seguro se soluciona pronto,\nDime que piensas...";
respuestaOmision[5] = "Debes esforzarte un poco mas para poder mejorar\n De acuerdo?";
respuestaOmision[6] = "Lo que me cuentas es muy vago. Dame mas detalles ...";
respuestaOmision[7] = "Eso no es un problema, es un reto que te hara crecer!";
respuestaOmision[8] = "Continua, soy todo oidos";
respuestaOmision[9] = "En estos casos ese tipo de problemas siempre aparece. \nVamos a centrarnos en un
}
public String tomaUnaRespuestaOmision() {
int indice = aleatorio.nextInt(respuestaOmision.length);
return respuestaOmision[indice];
}
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
16 / 1
... Solución 3
import java.util.HashSet;
import java.util.*;
public class Lector {
InOut io;
public Lector() {
io = new InOut();
}
public HashSet obtenerEntrada() throws IOException {
String [] aPalabras = new String[50];
int pos = 0;
System.out.print("> ");
String linea = io.readString().trim().toLowerCase();
StringTokenizer tok = new StringTokenizer(linea);
while (tok.hasMoreTokens()) {
aPalabras[pos++] = tok.nextToken();
}
HashSet palabras = new HashSet();
for(int i = 0; i < aPalabras.length; i++) {
palabras.add(aPalabras[i]);
}
return palabras;
}
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
18 / 1
Flujo de entrada/salida
El paquete java.io tiene varias clases para permitir operaciones de
entrada/salida. Estas clases se dividen en dos categorı́as:
Manejo de archivos de texto. Las clases se conocen como lectoras y
escritoras.
Manejo de archivos binarios. Las clases se conocen como flujos
(stream).
En este paquete se tiene la clase IOException para indicar que algo
está mal. Algunas de sus subclases son EOFException y
FileNotFoundException.
http://java.sun.com/docs/books/tutorial/essential/io/index.html
Amparo López Gaona ()
Paquetes
Septiembre de 2008
19 / 1
Grabación de texto
Los pasos involucrados en el almacenamiento de datos en un archivo
son:
Abrir el archivo.
Escribir los datos en el archivo.
Cerrar el archivo.
El patrón para hacer estos pasos con un archivo de texto es:
try {
FileWriter escritor = new FileWriter("nombre del archivo");
// FileWriter esc = new FileWriter("nombre del archivo", true);
...
while( ... ) {
...
escritor.write( texto );
...
}
escritor.close();
} catch (IOException e) {
....
Amparo
Paquetes
Septiembre de 2008
21 / 1
} López Gaona ()
Lectura de texto
Se podrı́a esperar que la lectura fuera con FileReader, el problema
es que lee un caracter a la vez, no puede leer lı́neas.
Se tiene una envoltura BufferedReader que sı́ permite leer lı́neas.
El patrón para hacer estos pasos con un archivo de texto es:
try {
BufferedReader lector = new BufferedReader(
new FileReader("nombre del archi
String linea = lector.readLine();
while(linea != null) {
...
linea = lector.readLine();
}
lector.close();
} catch (FileNotFoundException e) {
....
} catch (IOException e) {
....
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
23 / 1
Serialización de objetos
La serialización de objetos permite escribir objetos a archivos con una
sola instrucción.
También permite recuperar los objetos grabados en archivos.
Para que objetos de una clase puedan serializarse, es decir hacerse
persistes, es necesario que la clase implemente la interfaz
java.io.Serializable
La interfaz Serializable tiene el siguiente código:
public interface Serializable { }
Para que un objeto sea serializable todas las variables de la estructura
deben ser serializables.
Todos los tipos primitivos son serializables, al igual que los arreglos.
Amparo López Gaona ()
Paquetes
Septiembre de 2008
24 / 1
... Serialización de objetos
import java.io.Serializable;
import java.util.Date;
public class Obra implements Serializable {
private String autor;
private String titulo;
private String tema;
private Date anioNac;
private int anio;
...
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
26 / 1
... Serialización de objetos
import java.io.*;
import java.io.Serializable;
public class GrabadorObj {
private ObjectOutputStream escritor;
private String nombreArch ;
public void abrir() throws IOException {
nombreArch = "datos.ser";
abrir(nombreArch);
}
public void abrir(String nombre) throws IOException {
nombreArch = nombre;
try{
escritor = new ObjectOutputStream(new FileOutputStream(nombreArch));
} catch(IOException e){
System.out.println("Error en la apertura del archivo "+nombreArch
+ ": "+ e);
}
}
public void cerrar() throws IOException {
if (escritor != null) {
System.out.println("Cerrando el archivo "+ nombreArch);
escritor.close();
} else {
System.out.println("No se abrio ningun archivo.");
}
}
public void grabar(Object obj) throws IOException {
if (escritor != null)
escritor.writeObject(obj);
} Amparo López Gaona ()
Paquetes
Septiembre de 2008
28 / 1
Deserialización
public class LectorObj {
private ObjectInputStream lector;
private String nombreArch ;
public void abrir() throws IOException {
nombreArch = "datos.ser";
abrir(nombreArch);
}
public void abrir(String nombre) throws IOException {
nombreArch = nombre;
try{
lector = new ObjectInputStream(new FileInputStream(nombreArch));
} catch(IOException e){
System.out.println("Error en la apertura del archivo "+nombreArch + " para lectura");
}
}
public void cerrar() throws IOException {
if (lector != null) {
System.out.println("Cerrando el archivo "+ nombreArch);
lector.close();
} else {
System.out.println("No se abrio ningun archivo.");
}
}
public Object leer() throws IOException, ClassNotFoundException {
Object obj = null;
if (lector != null)
try {
obj = lector.readObject();
} catch (EOFException eof) { //Fin del archivo
} catch (Exception e) { System.out.println("Excepcion "+e); }
return obj;
Paquetes
Septiembre de 2008
} Amparo López Gaona ()
30 / 1
Ejemplo de uso de serialización
public class ObjetosPersistentes {
public static void main (String [] pps) {
GrabadorObj salida;
salida = new GrabadorObj();
String nombreDeArchivo;
nombreDeArchivo = (pps.length != 0) ? pps[0] : "prueba.ser";
try {
salida.abrir(nombreDeArchivo);
salida.grabar(new Persona("Andrea", 16));
salida.grabar(new Persona("Maria", 12));
salida.grabar(new Persona("Daniela", 12));
salida.grabar(new Persona("Mariana", 4));
salida.cerrar();
} catch(Exception e) { System.out.println("Error "+ e); }
LectorObj entrada = new LectorObj();
try {
entrada.abrir(nombreDeArchivo);
Persona obj;
do {
obj = (Persona) entrada.leer();
System.out.println(obj);
} while (obj != null);
entrada.cerrar();
} catch(Exception e) {
System.out.println("Error "+ e);
}
}
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
32 / 1
Serialización y agregación
public class Punto implements java.io.Serializable{
private int x;
private int y;
public Punto (int nuevaX, int nuevaY) {
x = nuevaX;
y = nuevaY;
}
public String toString(){
return new String("("+x+", "+y+")");
}
}
public class Rectangulo implements java.io.Serializable{
private int ancho ;
private int largo ;
private Punto origen;
public Rectangulo (Punto p, int a, int l) {
origen = p;
largo = l;
ancho = a;
}
public String toString(){
String texto=origen+" ancho: "+ancho+" largo :"+largo;
return texto;
}
}
En el caso de que Punto no implemente la interfaz Serializable se lanza una excepción java.io.NotSerializableException
Amparo López Gaona ()
Paquetes
Septiembre de 2008
34 / 1
Serialización y herencia
public abstract class Figura implements java.io.Serializable{
protected int x;
protected int y;
public Figura(int nuevaX, int nuevaY) {
x = nuevaX;
y = nuevaY;
}
public abstract double area();
}
class Circulo extends Figura{
protected double radio;
private static final double PI=3.1416;
public Circulo(int x, int y, double radio){
super(x,y);
this.radio=radio;
}
public double area(){
return PI*radio*radio;
}
}
class Rectangulo extends Figura{
protected double ancho, alto;
public Rectangulo(int x, int y, double ancho, double alto){
super(x,y);
this.ancho=ancho;
this.alto=alto;
}
public double area(){
return ancho*alto;
} Amparo López Gaona ()
Paquetes
Septiembre de 2008
36 / 1
... Serialización y herencia
public class ObjetosPersistentes {
public static void main (String [] pps) {
GrabadorObj salida;
salida = new GrabadorObj();
String nombreDeArchivo;
Figura fig1=new Rectangulo(10,15, 30, 60);
Figura fig2=new Circulo(12,19, 60);
nombreDeArchivo = (pps.length != 0) ? pps[0] : "prueba.ser";
try {
salida.abrir(nombreDeArchivo);
salida.grabar("Guardando objetos de una clases derivadas.\n");
salida.grabar(fig1);
salida.grabar(fig2);
salida.cerrar();
} catch(Exception e) { System.out.println("Error "+ e); }
Amparo López Gaona ()
Paquetes
Septiembre de 2008
38 / 1
... Serialización y herencia
public class ObjetosPersistentes {
public static void main (String [] pps) {
GrabadorObj salida;
salida = new GrabadorObj();
String nombreDeArchivo;
Figura fig1=new Rectangulo(10,15, 30, 60);
Figura fig2=new Circulo(12,19, 60);
nombreDeArchivo = (pps.length != 0) ? pps[0] : "prueba.ser";
try {
salida.abrir(nombreDeArchivo);
salida.grabar("Guardando objetos de una clases derivadas.\n");
salida.grabar(fig1);
salida.grabar(fig2);
salida.cerrar();
} catch(Exception e) { System.out.println("Error "+ e); }
LectorObj entrada = new LectorObj();
try {
entrada.abrir(nombreDeArchivo);
String str=(String)entrada.leer();
Figura obj1=(Figura)entrada.leer();
Figura obj2=(Figura)entrada.leer();
System.out.println("------------------------------");
System.out.println(obj1.getClass().getName()+" origen ("+obj1.x+", "+obj1.y+")"+" area="+obj1.area());
System.out.println(obj2.getClass().getName()+" origen ("+obj2.x+", "+obj2.y+")"+" area="+obj2.area());
System.out.println("------------------------------");
entrada.cerrar();
} catch(Exception e) {
System.out.println("Error "+ e);
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
38 / 1
Creación de paquetes
Si tenemos:
// en el archivo Desplazable.java
public interface Desplazable {
. . .
}
// en el archivo Figura.java
public abstract class Figura {
. . .
}
// en el archivo Circulo.java
public class Circulo extends Figura implements Desplazable {
. . .
}
// en el archivo Rectangulo.java
public class Rectangulo extends Figura implements Desplazable {
. . .
}
// en el archivo Punto.java
public class Punto extends Figura implements Desplazable {
. . .
}
// en el archivo Linea.java
public class Linea extends Figura implements Desplazable {
. . .
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
40 / 1
... Creación de paquetes
Resulta conveniente agruparlas en paquetes por lo siguiente:
Facilita determinar cuáles tipos (clases, interfaces) están relacionados.
Permite saber en donde están los tipos relacionados, por ejemplo,
para las funciones gráficas.
Los nombres de los tipos no entran en conflicto con los nombres de
tipos en otros paquetes, porque se crea una especie de espacio de
nombres.
Amparo López Gaona ()
Paquetes
Septiembre de 2008
41 / 1
... Creación de paquetes
La palabra reservada package permite agrupar clases e interfaces.
Debe ser la primera lı́nea del archivo que contiene las clases, interfaces
(tipos) que se desea incluir en el paquete.
La estructura del archivo en Java es:
Una única intrucción de paquete.
Las intrucciones de importación deseadas (opcional).
La declaración de una, y sólo una, clase/interfaz pública.
Las clases privadas del paquete (opcional).
Amparo López Gaona ()
Paquetes
Septiembre de 2008
42 / 1
Ejemplo de creación de paquetes
// en el archivo Desplazable.java
package geometria;
public interface Desplazable {
. . .
}
// en el archivo Figura.java
package geometria;
public abstract class Figura {
. . .
}
// en el archivo Circulo.java
package geometria;
public class Circulo extends Figura implements Desplazable {
. . .
}
// en el archivo Rectangulo.java
package geometria;
public class Rectangulo extends Figura implements Desplazable {
. . .
}
// en el archivo Punto.java
package geometria;
public class Punto extends Figura implements Desplazable {
. . .
}
// en el archivo Linea.java
package
Amparo geometria;
López Gaona ()
Paquetes
Septiembre de 2008
44 / 1
Acceso a elementos del paquete
El acceso a un elemento de un paquete puede ser:
Por su nombre “calificado” Ej. java.util.Iterator
El nombre corto Iterator si se incluyó al inicio del archivo la
instrucción import java.util.* o import java.util.Iterator.
Amparo López Gaona ()
Paquetes
Septiembre de 2008
45 / 1
Acceso a elementos del paquete
El acceso a un elemento de un paquete puede ser:
Por su nombre “calificado” Ej. java.util.Iterator
El nombre corto Iterator si se incluyó al inicio del archivo la
instrucción import java.util.* o import java.util.Iterator.
LA visibilidad de los elementos del paquete es:
Nivel de acceso
private
protected
public
package
Amparo López Gaona ()
clase
si
si
si
si
subclase
paquete
todos
si
si
si
si
si
si
Paquetes
Septiembre de 2008
45 / 1
Paréntesis: UML
UML (Unified Modeling Language) es un lenguaje gráfico para modelado
de sistemas de software.
Es una notación no es una metodologı́a.
Su objetivo es facilitar la comprensión del problema, identificar y construir
claramente la arquitectura de la solución.
Proporciona gran cantidad de tipos de diagramas para modelar sistemas
complejos.
Diagramas de casos de uso.
Diagramas de clases.
Diagramas de objetos.
Diagramas de actividad.
Diagramas de interacción, etc.
Amparo López Gaona ()
Paquetes
Septiembre de 2008
46 / 1
UML y Java
Clases:
public class Empleado {
...
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
48 / 1
UML y Java
Clases:
Empleado
public class Empleado {
...
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
48 / 1
... UML y Java
Estructura:
public class Empleado {
private double sueldo;
private int antiguedad;
private int emplID;
public String nombre;
protected double protegido;
...
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
50 / 1
... UML y Java
Estructura:
Empleado
public class Empleado {
private double sueldo;
private int antiguedad;
private int emplID;
public String nombre;
protected double protegido;
...
−sueldo : double
+ nombre: String
−antiguedad: int
− empID: int
# protegido:double
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
50 / 1
... UML y Java
Comportamiento:
public class Cuenta {
private float saldo;
private boolean ligada;
public boolean deposito (float monto)
{
...
}
public boolean retiro (float monto)
{
...
}
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
52 / 1
... UML y Java
Comportamiento:
Empleado
public class Cuenta {
private float saldo;
private boolean ligada;
− saldo : float
− ligada : boolean
+ retiro(monto: double): boolean
+ deposito(monto: double):boolean
public boolean deposito (float monto)
{
...
}
public boolean retiro (float monto)
{
...
}
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
52 / 1
... UML y Java
Interfaces:
public interface InstrumentoMusical {
...
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
54 / 1
... UML y Java
Interfaces:
public interface InstrumentoMusical {
...
}
<<interface>>
InstrumentoMusical
InstrumentoMusical
Amparo López Gaona ()
Paquetes
Septiembre de 2008
54 / 1
... UML y Java
Paquetes:
package estructuras;
Amparo López Gaona ()
Paquetes
Septiembre de 2008
56 / 1
... UML y Java
Paquetes:
package estructuras;
Amparo López Gaona ()
estructuras
Paquetes
Septiembre de 2008
56 / 1
Relaciones entre clases
Herencia
public class Empleado extends
Persona {
...
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
58 / 1
Relaciones entre clases
Herencia
Persona
public class Empleado extends
Persona {
...
}
Empleado
Amparo López Gaona ()
Paquetes
Septiembre de 2008
58 / 1
... UML y Java
Implementación de interfaces:
public class InstumentoViento implements InstrumentoMusical {
...
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
60 / 1
... UML y Java
Implementación de interfaces:
public class InstumentoViento implements InstrumentoMusical {
...
}
InstrumentoViento
<<interface>>
InstrumentoMusical
InstrumentoMusical
InstrumentoViento
Amparo López Gaona ()
Paquetes
Septiembre de 2008
60 / 1
... UML y Java
Agregación
public class Orden {
private Elemento elementos[];
private Detalle detalles;
...
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
62 / 1
... UML y Java
Agregación
Rectangulo
public class Orden {
private Elemento elementos[];
private Detalle detalles;
...
Elemento
Detalle
}
Amparo López Gaona ()
Paquetes
Septiembre de 2008
62 / 1