Capitulo2POOEnJava PDF
Capitulo2POOEnJava PDF
1
CAPÍTULO II: PROGRAMACIÓN ORIENTADA AL
OBJETO CON JAVA
Modularidad:
Permite subdividir una aplicación en partes más pequeñas (llamados
módulos), cada una de las cuales debe ser tan independientes como sea
posible de la aplicación en sí y de las restantes partes.
Brecha
Semántica
Casa Auto
Vive en Conduce
Modelo un Árbol
Tom
2.5
En la etapa de análisis aparecen los objetos del dominio del problema, es
decir, los objetos del mundo real.
Especificación de la
solución
Objetos definidos durante el
diseño
¿Cómo?
2.6
2.2. Modelo del dominio
“El modelo de dominio representa las “cosas” que existen o eventos que
transcurren en el entorno de un negocio.” [I. Jacobsen]
Concepto de relacionamiento
Ejemplo
Para un problema dado, se pueden efectuar las siguientes aseveraciones:
Un cliente coloca cero o más ordenes de compra.
Una orden de compra es colocada por uno y sólo un cliente.
1 Coloca *
Cliente Orden
Tipos de multiplicidad
1
Concepto 1 y sólo 1
* Concepto 0 ó más
n..m
Concepto
Entre n y m
2.9
La multiplicidad define cuántas instancias de un concepto A pueden
asociarse a un concepto B.
Ejemplos
1..* pertenece 1
Profesor Depto
1..* pertenece 1
Alumno Carrera
Comprobante de pago
2.13
Asociaciones
1..*
1..*
1..* 1..*
2.14
Atributos
nombre rut
dirección
rut
1..*
1..*
1..*
tipo
rut
2.15
El Modelo del Dominio se obtiene identificando:
1. Entidades
a. Nombre
b. Propiedades o características
2. Relaciones
a. Nombre
b. Dirección
c. Cardinalidad
3. Restricciones
Problema Tutores
En los últimos años la Universidad Católica del Norte se ha preocupado
por el rendimiento de sus alumnos y ha puesto en marcha el plan piloto
“Tutores” en algunas carreras específicas. Cómo el número de carreras ha
sido pequeño, toda la información del plan ha sido realizada a mano hasta
el momento. El plan ha dado como resultado una mejora superior a lo
esperado, es por ello, que la UCN ha decidido expandir el plan al resto de
los alumnos.
2.16
Modelo del Dominio
Area de especialización
2.17
Modelo del Dominio
Area de especialización
Alumno tutelado
asiste
Alumno tutor
2.18
Modelo del Dominio
Area de especialización
Alumno tutelado
tutelado
asiste
Alumno tutor
2.19
Modelo del Dominio
¿Tiene restricciones?, ¿Cuáles?
Restriciones Tutores
Nombre del alumno no puede ser inferior a 2 letras.
Rut del alumno debe ser válido.
Nota de enseñanza media debe estar en el intervalo 1.0 – 7.0. Se
aceptan las notas con un dígito decimal.
Puntaje de ingreso debe ser un valor entero entre 500 y 900 puntos.
Semestre que cursa debe ser un valor entre 1 y 14.
Un alumno sólo puede ser tutor si ha cursado a lo menos dos
semestres de su carrera y posee menos de cinco asignaturas inscritas
en el semestre.
…
Operaciones en el modelo del dominio
En el modelo del dominio se pueden colocar operaciones cuando éstas
son parte del modelo del negocio y son calculables. A este nivel, en el
análisis se está preocuado de los conceptos, atributos y relacionamientos y
normalmente no estamos preocupados de identificar las operaciones
Operaciones Tutores
Obtener la cantidad de horas en que el tutor realizó la tutela.
Calcular el incentivo que le corresponde.
2.20
Modelo del Dominio + Operaciones
asiste
Calcular horas()
Calcular incentivo()
2.21
Ejercicio
Se debe construir una aplicación maneje los proyectos en los que trabaja
un empleado. En un proyecto trabajan muchos empleados y un empleado
puede trabajar en varios proyectos. Es importante saber cuántas horas a la
semana le dedica cada empleado a cada uno de los proyectos en que
trabaja .
* trabajan 1..*
Proyecto Empleado
Código proyecto Rut empleado
Nombre proyecto Nombre empleado
Dedicacion
horas a la semana
Otra forma
1..* *
Dedicacion
horas
2.22
Ejercicio
Se debe construir una aplicación para que el jefe de carrra de ICCI pueda
inscribirle a los estudiantes de la carrera las asignaturas de un determinado
semestre. Para esto el jefe de carrera atiende a cada uno de los alumnos en
su oficina, utilizando la aplicación para la inscripción. Cabe señalar que
cuando el jefe de carrera le inscribe una asignatura a un estudiante, debe
indicar en qué oportunidad la está inscribiendo. De una asignatura interesa
el código, nombre y créditos. De un estudiante, su rut y nombre. Esta
aplicación tendrá como usuario solo al jefe de carrera.
Construya el modelo del dominio
1..* inscribe 1..*
Estudiante Asignatura
nombre codigo
rut nombre
Inscripcion creditos
oportunidad
Otra forma
Estudiante
1 Asignatura
tiene tiene
Rut 1
Código
Nombre Nombre
Créditos
1..* 1..*
Inscripcion
Jefe de Carrera Oportunidad
2.23
2.3. Conceptos de orientación al objeto
2.3.1. Cinco palabras claves del vocabulario O.O
Ejemplo:
Clase con sus atributos:
Persona
nombre: String
edad : int
2.24
Objetos con sus valores
p1: Persona p2: Persona
Objeto:
Ejemplos de Clases:
Puerta Para una empresa que fabrica puertas y ventanas
Empleado Para un sistema de remuneraciones
Habitación Para un sistema de reservas de un hotel
Vehículo Para un sistema de arriendo de vehículos
Ejemplos de Atributos:
Puerta largo
ancho
espesor
tipo de madera
2.26
Empleado rut
nombre
dirección particular
fono particular
fono empresa
Habitación número
cantidad de camas
metros cuadrados
citófono
valor
Vehículo patente
marca
modelo
año
Ejemplo de Comportamiento:
Puerta abrir
cerrar
poner llave
sacar llave
2.27
Ejercicio
Se tiene que hacer un programa que maneje información de los alumnos y
profesores de la UCN. Identifique las clases e indique para ellas atributos y
comportamiento. Muestre para cada una de las clases identificadas, 2
ejemplos de objetos.
Alumno Profesor
numeroMatricula: String nombre: String
nombre: String tipo: int
edad : int
Diagrama de clase
Nombre de Clase
Visibilidad tipo de dato 1 nombre atributo 1
Visibilidad tipo de dato 2 nombre atributo 2
...
Ejemplo:
Persona
- private - String nombre
+ public - int edad
+ Persona()
+ getEdad(): int
+ getNombre(): String
+ setEdad()
+ setNombre()
2.30
Variable de Instancia:
Una variable de instancia pertenece a una instancia. Su valor sólo
puede ser cambiado por operaciones que pertenecen a la instancia.
Variable de Clase:
Variable compartida por todas las instancias de una clase (una ÚNICA
copia).
Todos los objetos de la clase la pueden ver.
Ejemplo:
CuentaAhorro
Variable de
- int numero instancia
- int saldo
- $ double interes
Variable de clase
2.31
Métodos de instancia:
Pertenece a un objeto.
Métodos de clase:
Está asociado a una clase.
Ejemplo:
Variables de instancia
CuentaAhorro
Variable de clase
- int numero
- int saldo
- $ double interes
Método de instancia
+ getNumero(): int
+ $ getInteres(): double
Método de clase
Forma de invocación:
c.getNumero() c es un objeto de la clase CuentaAhorro
CuentaAhorro.getInteres()
2.32
2.3.4. Operaciones sobre un objeto
Modificador
Selector
Iterador
Constructor
Destructor
NombreClase nombreVariable;
B. Creación de objetos
Un objeto en JAVA, se construye únicamente por la expresión de creación
dinámica, que tiene la forma:
x y
D. Comparación de Objetos
String x, y if (x = = y) falso
(1)
a a if (x.equals(y)) verdadero
(2) x = y;
(2)
x y if ( x == y) true
Ejemplo de igualdad:
int x, y
x y
if (x = = y) verdadero
5 5
E. Destrucción de objetos
En el diagrama de
Alumno clases, los métodos
- String nombre deben ir con sus
- String numeroMatricula parámetros
+ Alumno()
+ getNombre(): String
+ getNumeroMatricula(): String
+ setNombre()
+ setNumeroMatricula()
+ toString(): String
/**
* @param nom
* @param matricula
*/
public Alumno(String nom, String matricula) {
nombre = nom;
numeroMatricula=matricula;
}
/**
* @return the nombre
*/
public String getNombre() {
return nombre;
}
/**
* @param nom the nombre to set
*/
public void setNombre(String nom) {
nombre = nom;
}
/**
* @return the numeroMatricula
*/
public String getNumeroMatricula() {
return numeroMatricula;
}
/**
* @param matricula the
*numeroMatricula to set
*/
public void setNumeroMatricula(String matricula) {
numeroMatricula=matricula;
} El método toString() sobre
/* (non-Javadoc) escribe desde
* @see java.lang.Object#toString() java.lang.Objetct.toString
*/
@Override
public String toString() {
return "Alumno [nombre=" + nombre + ", numeroMatricula=" +
numeroMatricula + "]";
}
}
2.38
Ejemplo de programa en Java
Se desea manejar la información de las cuentas bancarias de un banco. Una
cuenta tiene un saldo. Se puede depositar y girar sobre la cuenta bancaria.
La aplicación debe hacer un depósito sobre una cuenta y luego un giro sobre
la misma cuenta. Una vez hechas las transacciones sobre la cuenta, se debe
desplegar su saldo.
Diagrama de clases
CuentaBancaria Nombre de la Clase
- int saldo Variable de Instancia
+ CuentaBancaria()
+ depositar()
+ girar(): boolean
+ getSaldo(): int Métodos de Instancia
+ setSaldo() La clase CuentaBancaria podría
+ toString(): String también tener un número
/**
* @param saldo
*/
public CuentaBancaria(int saldoInicial) {
saldo = saldoInicial;
}
/**
* @return the saldo
*/
public int getSaldo() {
return saldo;
}
2.39
/**
* @param saldo the saldo to set
*/
public void setSaldo(int saldoNuevo) {
saldo = saldoNuevo;
}
}//Fin cuentaBancaria
2.40
import ucn.StdOut;
Se imprime
Saldo antes de las transacciones: 100
Diagrama de objetos
cuentaBancaria: CuentaBancaria
saldo = 100
174
154
2.41
Ejercicio
Dado el siguiente diagrama de clases, complételo y escriba en Java la clase
Asignatura y un programa Java que cree un objeto Asignatura cuyo código
es “cc 571” y créditos = 14. Una vez creado el objeto se debe desplegar por
pantalla sus datos.
Asignatura
codigo
creditos
Asignatura()
getCodigo()
getCreditos()
setCodigo() No todo atributo debe tener
setCreditos() el método set, por ejemplo,
para el código no es
necesario
Solución
Asignatura
- String codigo
- int creditos
+ Asignatura()
+ getCodigo(): String
+ getCreditos(): int
+ setCodigo()
+ setCreditos()
2.42
public class Asignatura {
private String codigo;
private int creditos;
Ejemplo
El programa siguiente, crea dos objetos Punto diferentes y pone valores
únicos en cada uno.
Cuando no hay rutina constructora,
public class Punto { se crea el objeto quedando todos sus
private int x; atributos nulos
private int y;
Punto p =new Punto()
public void setX(int xx){
x = xx;
}
Punto
public void setY(int yy){
y = yy; - int x
} - int y
public int getX(){
return x; + setX()
} + setY()
public int getY(){ + getX(): int
return y; + getY(): int
}
} Podríamos tener el método toString()
p2.setX(42);
p2.setY(99);
p1.init(10, 20);
p2.init(42, 99);
}
2.46
2.3.6. Mensajes a THIS
Ejemplo 1 :
Inicializar las variables de una clase, utilizando el constructor.
Punto
- int x
- int y
+ Punto()
+ getX(): int
+ getY(): int
2.47
public class Punto {
private int x;
private int y;
Ejemplo 2:
Empleado
…
+ Punto()
public Punto(int x, int y) { + setX()
this.x = x; + setY()
this.y = y; + getX(): int
} + getY(): int
+ distancia(int x, int y): double
public int getX(){ + distancia(Punto p): double
return x;
} En el diagrama de clases, se deben colocar
public int getY(){ todas las versiones de los métodos
return y; sobrecargados. Se diferencian por los
} parámetros
//….Métodos set
2.50
public double distancia(int x, int y) {
int dx = this.x - x;
int dy = this.y - y;
return Math.sqrt(dx*dx + dy*dy);
}
public double distancia(Punto p) {
return this.distancia(p.x, p.y);
}
}
Ejemplo
Para un problema dado, se pueden efectuar las siguientes aseveraciones:
Un cliente coloca cero o más ordenes de compra.
Una orden de compra es colocada por uno y sólo un cliente.
1 *
Cliente Orden
* Clase 0 ó más
n..m
Clase Entre n y m
2.4.3. Agregación
Algunas veces los objetos / clases están formados por otros objetos.
Ejemplos:
Auto:
Transmisión
Tubo de escape
Motor
Suspensión
Ruedas
2.53
Ventana:
Botones
Labels
Menús
Ejemplo 1: Computador
1 1 1 1
Monitor Caja Mouse Teclado
sistema
1 1 1 1
Chassis Cpu RAM Ventilador
2.54
Ejemplo 2:
Libro
1 0..1 1..* 1
Cubierta Tabla de Capítulo Indice
contenido
s
1..*
Pagina
1..*
Párrafo
1..*
Palabra
2.4.4. Composición
A * B
Compuesto Componente
ListaDoubles
- double [ ] lista
- int cantidadElementos
- int max
+ ListaDoubles()
+ encontrar(): int
+ insertar(): boolean
+ eliminar(): boolean
+ getCantidadElementos(): int
+ getElemI(): double
2.56
// ListaDoubles.java
import ucn.StdOut;
public class ListaPersonasApp {
public static void desplegarPersonas(ListaPersonas
listaPersonas){
// despliega los items
StdOut.println("Despliegue de las personas");
for(int i=0; i<listaPersonas.getCantidadPersonas();i++){
Persona p = listaPersonas.getPersonaI(i);
StdOut.println(p.getApellido() + " " +
p.getNombre() + " " +p.getEdad());
}
StdOut.println();
}
// inserta 10 items
Persona p = new Persona("Martinez", "Jose", 24);
listaPersonas.ingresarPersona(p);
Persona p9 = new Persona("Tapia","Luis",37);
listaPersonas.ingresarPersona(p9);
Persona p1 = new Persona("Viorklumds", "Jorge", 43);
listaPersonas.ingresarPersona(p1);
Persona p2 = new Persona("Ferrada", "Cecilia", 63);
listaPersonas.ingresarPersona(p2);
Persona p3 = new Persona("Vega","Carlos",21);
listaPersonas.ingresarPersona(p3);
Persona p4 = new Persona("Salazar","Rozana", 29);
listaPersonas.ingresarPersona(p4);
Persona p5 = new Persona("Galleguillos","Ingrid",72);
listaPersonas.ingresarPersona(p5);
Persona p6 = new Persona("Alfaro","Eduardo",54);
listaPersonas.ingresarPersona(p6);
Persona p7 = new Persona("Sanchez", "Yazmin", 22);
listaPersonas.ingresarPersona(p7);
Persona p8 = new Persona("Vergara","Vladimir",18);
listaPersonas.ingresarPersona(p8);
2.64
desplegarPersonas(listaPersonas);
StdOut.println("Despliegue de las personas");
StdOut.println(listaPersonas.toString());
StdOut.println();
StdOut.println("Buscando a Martinez");
String apellido = "Martinez"; // busca el item
Persona found=listaPersonas.buscarPersona(apellido);
if(found != null){
StdOut.print("Encontrado ");
StdOut.println(found.getApellido() + " " +
found.getNombre() +" " + found.getEdad());
}
else {
StdOut.println("No encontrado " + apellido);
}
StdOut.println();
StdOut.println("Eliminando Viorklumds, Vega y Alfaro");
// elimina 3 items
boolean pudoEliminar=listaPersonas.eliminar("Viorklumds");
if (pudoEliminar){
StdOut.println("si elimino a Viorklumds");
}
pudoEliminar =listaPersonas.eliminar("Vega");
if (pudoEliminar){
StdOut.println("si elimino a Vega");
}
pudoEliminar =listaPersonas.eliminar("Alfaro");
if (pudoEliminar){
StdOut.println("si elimino a Alfaro");
}
StdOut.println();
desplegarPersonas(listaPersonas);
StdOut.println("Despliegue de las personas");
StdOut.println(listaPersonas.toString());
StdOut.println();
}//Fin main
}// Fin ListaPersonasApp
2.65
Se imprime:
Despliegue de las personas
Martinez Jose 24
Tapia Luis 37
Viorklumds Jorge 43
Ferrada Cecilia 63 Despliegue con método estático de la
Vega Carlos 21 App desplegarPersonas
Salazar Rozana 29
Galleguillos Ingrid 72
Alfaro Eduardo 54
Sanchez Yazmin 22
Vergara Vladimir 18
Buscando a Martinez
Encontrado Martinez Jose 24
Con:
Persona p = new Persona("Martinez", "Jose", 24);
listaPersonas.ingresarPersona(p);
cantidadPersonas
0
1
Persona
apellido: Martinez
nombre: Jose
edad: 24
p
2.67
p = listaPersonas[0]
Con:
p = new Persona("Tapia","Luis",37);
listaPersonas.ingresarPersona(p);
cantidadPersonas
0
1
2
Persona Persona
apellido: Martinez apellido: Tapia
nombre: Jose nombre: Luis
edad: 24 edad: 37
p ≠ listaPersonas[0] p = listaPersonas[1]
Persona * ListaPersonas
- String apellido - Persona [] lp
- String nombre - int cantidadPersonas
- int edad
+ ListaPersonas()
+ Persona() + insertar(): boolean
+ get y set …. + insertionSort()
+ toString(): String + getCantidadPersonas(): int
+ getPersonaI(i): Persona
+ toString(): String
// get y set ….
// toString()….
} //fin insertionSort()
//toString()....
StdOut.println(“Antes de ordenar:”) ;
desplegarPersonas(listaPersonas); Se podría desplegar la
lista de personas usando
listaPersonas.insertionSort(); el método toString(),
como en el caso del
StdOut.println(“Despues de ordenar:”) ; ejemplo anterior
desplegarPersonas(listaPersonas);
}//fin main()
1 1
A B
A B
Ref. B. Ref. A.
2.73
Ejercicio
Un médico tiene rut, nombre, registro médico y especialidad. Un paciente
tiene rut, nombre, diagnóstico y médico de cabecera (sólo 1).
Diagrama de Objetos
rut=111-k rut=222-1
registroMedico=151-5 diagnostico=Apendicitis
especialidad=cardiologo medico
2.76
2.6.3. Implementación de una asociación 1:N y/o N:N
Asociación 1: N
1 1..n
A B
A B
Conjunto Ref. A.
de ref.
Asociación N: N
1..n 1..n
A B
A B
Conjunto Conjunto
Ref. B. Ref. A.
Diagrama de Objetos
c: Ciudad
nombre= Santiago
alcalde= Alessandri
cantidadHabiatntes= 6000000
p: Pais
c: Ciudad
nombre= Chile
nombre= Antofagasta
idioma=Español
cantidadHabitanes=18000000 alcalde= Rojo
cantidadHabitantes= 400000
listaCiudades
cantidadCiudades= 3 c: Ciudad
nombre= Concepcion
alcalde= Ortiz
cantidadHabitantes= 1000000
2.82
Otra versión del mismo problema
Diagrama de Clases del dominio de la aplicación
Pais Ciudad
- String nombre
- String nombre
- String alcalde
- String idioma -int cantidadHabitantes
- int cantidadHabitantes
- ListaCiudades listaCiudades + Ciudad( )
+ get y set()…
+ Pais( )
+ toString(): String
+ get y set()….
+ getListaCiudades(): ListaCiudades *
+ toString(): String 1
ListaCiudades
- Ciudad [] lc
- int cantidadCiudades
- int max
public class Pais {
private String nombre; Objeto contenedor + ListaCiudades( )
+ getCantidadCiudades(): int
private String idioma;
+ insertarCiudad():boolean
private int cantidadHabitantes; + getCiudadI(i): Ciudad
private ListaCiudades listaCiudades; + toString(): String
public Pais (String nombre, String idioma, int cantidadHabitantes,
int max) {
this.nombre = nombre;
this.idioma= idioma;
this.cantidadHabitantes = cantidadHabitantes;
this.listaCiudades = new ListaCiudades(max);
}
public int getCantidadHabitantes() {
return this.cantidadHabitantes;
}
2.83
public String getIdioma() {
return this.idioma;
}
public String getNombre () {
return this.nombre;
}
public ListaCiudades getListaCiudades() {
return this.listaCiudades;
}
//toString()…..
}
nombre codigo
rut nombre
Inscripcion creditos
oportunidad
Otra forma
Estudiante Asignatura
tiene tiene
1 1
Rut Código
Nombre Nombre
Créditos
1..* 1..*
Inscripcion
Oportunidad
ListaEstudiantes
- int cantidadEstudiantes 2.87
- Asignatura [] lista
Diagrama de clases - int max
+ ListaEstudiantes()
+ ingresar(): boolean
+ buscar(): Asignatura
+ eliminar(): boolean
+ getEstudianteI(int i): Estudiante
+ getCantidadEstudiantes(): int
+ setCantidadEstudiantes ():int
+ getMax(): int
+ setMax()
1 *
ListaInscripciones * Estudiante
Inscripcion 1 - String rut
- int cantidadInscripciones - int oportunidad
- Inscripcion [] lista - String nombre
- Asignatura asignatura - ListaInscripciones listaInscripciones
- int max - Estudiante estudiante
+ ListaInscripciones() + Estudiante()
+ Inscripcion() + getRut(): String
+ ingresar(): boolean + getOportunidad(): int
+ buscar(): Inscripcion + setRut()
+ setOportunidad() + getNombre(): String
+ eliminar(): boolean + getEstudiante(): Estudiante
+ getInscripcionI(int i): Inscripcion + setNombre ()
+ setEstudiante() + getListaInscripciones(): ListaInscripciones
+ getCantidadInscripciones(): int + getAsignatura(): Asignatura
+ setCantidadInscriciones() + setListaInscripciones()
+ setAsignatura()
+ getMax(): int
+ setMax() 1
1
Asignatura
ListaAsignaturas - String codigo
- int cantidadAsignaturas - String nombre
* - int creditos
- Asignatura [] lista
- int max - ListaInscripciones listaInscripciones
+ ListaAsignaturas() + Asignatura()
+ ingresar(): boolean + getCodigo(): String
+ buscar(): Asignatura + setCodigo()
+ eliminar(): boolean + getNombre(): String
+ getAsignaturaI(int i): Asignatura Se podrían tener el + setNombre ()
+ getCantidadAsignaturas(): int método toString() en + getCreditos(): int
+ setCantidadAsignaturas () + setCreditos()
+ getMax(): int cada una de las clases + getListaInscripciones(): ListaInscripciones
+ setMax() + setListaInscripciones()
2.88
2.7. Arquitectura de una aplicación
2.7.1. Contratos
Estructura de un contrato
Operación Nombre de la operación y parámetros de entrada y salida
Descripción Breve descripción de la operación
Precondiciones Suposiciones relevantes sobre el estado del sistema o de los objeto
o conceptos del modelo de dominio antes de la ejecución de la
operación.
Son las condiciones que tiene que cumplir el sistema, no la lógica
de la aplicación
Si no existe o no se cumple la precondición, el contrato no es válido
(lanzar un error)
Postcondiciones Resultado esperado de la operación y estado de los objetos o
conceptos del dominio después de que se complete la operación.
Si solo se obtiene información, no hay post condición
Si se ingresa, actualiza o elimina información, si hay post
condición
Ejemplos de Contratos
Operación float sqrt(float número)
Descripción Calcula la raíz cuadrada de número
Precondiciones El valor del número debe ser mayor o igual a 0.
Postcondiciones El resultado de la operación contemplará un margen de error de a
lo mucho de un 0,1%.
sqr(número) implica que el resultado obtenido será un número
decimal mayor o igual a 0.
2.90
Contratos Tutores
Operación Calcular horas()
Ejemplo
Diagrama de clases
<<interface>>
ListaAlumnos
+getElemento(): Alumno
+buscarElemento(): int
+insertarElemento(): boolean
+eliminarElemento(): boolean
+limpiar()
+isVacia():boolean
+getTamanio(): int
<<implements>>
ListaArregloEstatico * Alumno
- Alumno [] arreglo - int rut
- int posicionUltimoElemento - String nombre
- String apellido
- String direccion
….
2.94
public class Alumno {
private int rut;
private String nombre;
private String apellido;
private String direccion;
public Alumno() {
}
public String getApellido() {
return this.apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public String getDireccion() {
return this.direccion;
}
public void setDireccion(String direccion) {
this.direccion = direccion;
}
public String getNombre() {
return this.nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public int getRut() {
return this.rut;
}
public void setRut(int rut) {
this.rut = rut;
}
//toString()….
}//Fin Alumno
2.95
/**
* Interface que representa el comportamiento de una lista de
* Alumnos. Esta puede ser implementada de la forma que se desee,
* es decir utilizando:
* - Arreglos estaticos:
* - Listas con nexo.
*/
public interface ListaAlumnos {
/**
* Metodo que dada la posicion de un elemento dentro de la lista
* retorna el elemento en esa posicion.
*Si la posicion en la lista no existe retorna null.
* @param posicion
* @return Alumno/null
*/
public Alumno getElemento(int posicion);
2.96
/**
* Metodo que dado un elemento retorna la posicion en la cual se
* encuentra dentro de la lista. Retorna -1 si el dato no se encuentra.
* @param elemento
* @return int posicion del elemento dentro de la lista.
*/
public int buscarElemento(Alumno elemento);
/**
* Metodo que inserta un elemento al final de la lista, retorna true si
* fue exitosa la insercion (hay espacio para almacenarlo) o false si
* la lista se encuentra llena.
* @param elemento
* @return boolean true/false
*/
public boolean insertarElemento(Alumno elemento);
/**
* Metodo que elimina el elemento en la "posicion" de la lista.
* Si la posición no existe, retorna falso. En caso contrario
* elimina el dato y retorna true.
* @param posicion
* @return boolean true/false
*/
public boolean eliminarElemento(int posicion);
/**
* Metodo que elimina todos los datos de la lista, es decir la
* deja vacia
*/
public void limpiar();
2.97
/**
* Metodo que retorna true si y solo si no hay ningún elemento
* presente en la lista
* @return boolean (true/false)
*/
public boolean isVacia();
/**
* Metodo que retorna la cantidad de elementos que posee la lista,
* por ejemplo: Si la lista se encuentra vacia retorna 0;
* @return int cantidad de elementos en la lista.
*/
public int getTamanio();
/**
* Clase que implementa la interface Lista que permite almacenar
* Alumnos
*/
public class ListaArregloEstatico implements ListaAlumnos {
private Alumno[] arreglo;
private int posicionUltimoElemento;
/**
* Constructor de la clase ListaArregloEstatico
* @param _capacidadMaxima : Cantidad maxima de elementos
* que puede almacenar esta lista.
*/
public ListaArregloEstatico(int capacidadMaxima) {
this.arreglo = new Alumno[capacidadMaxima];
this.posicionUltimoElemento = -1;
}
2.98
public Alumno getElemento(int posicion) {
if (posicion < 0 || posicion > this.arreglo.length) {
return null;
}
// Si no hay un dato en esa posicion
if (posicion > this.posicionUltimoElemento) {
return null;
}
return this.arreglo[posicion];
}
//Buscar al alumno 2
StdOut.println("Alumno 2 encontrado en posicion:" +
lista.buscarElemento(alumno2));
} //Fin main
Ejemplo Calculadora
Se requiere implementar una calculadora con las 4 operaciones básicas.
Diagrama de
la Interfaz
2.103
Contratos en Java y su documentación
2.104
2.105
2.106
Implementación de los contratos
La implementación de los contratos, implica escribir una Clase, la cual
debe incluir como mínimo todos los sub-programas (métodos) que la
interface declara.
Cuando se trabaja con interfaces, se tiene concentrada en ella todas las
operaciones que hará el sistema
Un contrato se debe implementar en un método de la interface.
2.107
2.108
Ejercicio
Dada la siguiente interfaz, realizar los contratos para cada una de las
operaciones.
Construir una clase que implemente las operaciones de la interfaz.
Diseñar el diagrama de clases.
<<interface>>
BancoUCN
/**
* Realiza el pago de una compra por parte del alumno
* Restricciones:
* Que el alumno exista.
* La clave debe ser la del alumno.
*
* @param rut del alumno.
* @param clave del alumno.
* @param monto a descontar del monedero del alumno.
* @return true si fue posible realizar la compra.
*/
boolean realizarCompra(String rut, String clave,
int monto);
}
2.111
Implementación de la interfaz
/**
* Clase que implementa el “como” funciona el sistema,
* a partir del “que”
* declarado por los contratos.
* @author Diego P. Urrutia <[email protected]>
* @version 2014.03.20
*/
/**
* @see BancoUCN#agregarAlumno
*/
public boolean agregarAlumno(String nombre,
String rut, String clave, int montoInicial) {
………
2.112
Diagrama de Clases
- $ MAX_MONTO =500
<<implements>>
1 ListaAlumnos * Alumno
- ListaAlumnos listaAlumno …
….
)
2.113
Diagrama de clase
En un diagrama de clases, el “estereotipo” es una marca que se coloca
sobre el título o sobre una relación para indicar su comportamiento, por
ejemplo <<interface>>.
En JAVA, los paquetes son recipientes con clases, que se utilizan para
mantener el espacio de nombres de clase, dividido en compartimentos.
Por ejemplo, un paquete permite que se cree una clase llamada LISTA,
que se puede almacenar en un paquete propio, sin preocuparse por
conflictos con otra clase llamada LISTA, escrita por otra persona.
Paquetes:
Paquete por omisión.
Paquete P
Paquete R
D. java
El paquete P contiene las clases P.B y P.C.
El paquete P.R contiene la clase P.R.D.
Las clases A y B, se accesan directamente.
2.116
¿Cómo se organiza un proyecto en los paquetes?
.dominio
Las clases de los
objetos del dominio.
Por ejemplo, Persona,
Alumno, etc.
La clase comparador
(es interna a Persona)
.logica
Interface
pais.nombreOrganización.nombreProyecto
La clase que
implementa la
Todo en minúscula interface
Contenedores
App
.utils
Ejemplo:
Cualquier cosa que
cl.ucn.ei.pa.sistemaPaisesCiudades
no vaya en lógica
ni en dominio
Ejemplo 1
Se desea manejar la información de una cuenta bancaria de un banco. Una
cuenta tiene un saldo. Se puede depositar y girar sobre la cuenta bancaria.
La aplicación debe hacer un depósito sobre la cuenta y luego un giro sobre la
misma cuenta. Una vez hechas las transacciones sobre la cuenta, se debe
desplegar su saldo.
Contratos
CuentaBancaria
- int saldo
+ CuentaBancaria()
+ girar(): boolean
+ depositar(): boolean
+ getSaldo(): int
+ setSaldo()
+ toString(): String
2.119
Diagrama de clases
<<interface>>
SistemaCuentaBancaria
+ depositar()
+ girar()
+ obtener DatosCuentaBancaria(): String
<<implements>> tiene
CuentaBancaria
SistemaCuentaBancariaImpl 1
o
1
2.120
/**
* © 2016 Escuela Ingenieria, UCN
*/
package cl.ucn.ei.pa.proyectocuentabancaria.dominio;
/**
* @author Loreto Telgie
* @Version: 1 septiembre 2016
*
*/
public class CuentaBancaria {
private int saldo;
/**
* @return the saldo
*/
public final int getSaldo() { Una alternativa a
return saldo; tener la lógica de
}
la aplicación en una
/** clase del dominio, es
* @param saldo the saldo to set tenerla en la clase
*/
public final void setSaldo(int saldo){ que implementa la
this.saldo = saldo; interfaz.
} Lo anterior con la
/**
finalidad de que las
* @param saldo clases del dominio
*/ de la aplicación
public CuentaBancaria(int saldo) { tengan solo la rutina
this.saldo = saldo;
} constructora y los
get y set.
public boolean girar(int montoGiro){
if (montoGiro < saldo){
saldo = saldo - montoGiro;
return true;
}
else{
return false;
}
}
2.121
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override Toda clase tiene un método toString()
public String toString() {
return "CuentaBancaria [saldo=" + saldo + "]";
}
}//Fin CuentaBancaria
/**
* © 2016 Escuela Ingenieria, UCN
*/
package cl.ucn.ei.pa.proyectocuentabancaria.logica;
/**
* @author Loreto Telgie
* @Version: 1 Septiembre 2016
*
*/
/**
* @param montoDeposito: monto a depositar
*
* Descripción Se deposita dinero en la cuenta
* Precondiciones: Que exista la cuenta bancaria
* Postcondiciones: Saldo actualizado de la cuenta
*
*
*/
public boolean depositar (int montoDeposito);
/**
* @param montoGiro: monto a girar
* Descripción Se gira dinero desde la cuenta
* Precondiciones: Que exista la cuenta bancaria
* Postcondiciones: Saldo actualizado de la cuenta
*/
public boolean girar(int montoGiro);
/**
* @return un string con los datos de la cuenta bancaria
* Descripcion: Retorna los datos de la cuenta bnacraia
* Precondiciones: Que exista la cuenta bancaria
* Postcondiciones
*/
public String obtenerDatosCuentaBancaria();
}
2.123
/**
* © 2016 Escuela Ingenieria, UCN
*/
package cl.ucn.ei.pa.proyectocuentabancaria.logica;
import cl.ucn.ei.pa.proyectocuentabancaria.dominio.CuentaBancaria;
/**
* @author Loreto Telgie
* @version: 1 septiembre 2016
*
*/
public class SistemaCuentaBancariaImpl implements
SistemaCuentaBancaria{
private CuentaBancaria cuentaBancaria; ;
/**
* @see cl.ucn.ei.pa.proyectocuentabancaria.logica.
SistemaCuentaBancaria#girar(int)
*/
public boolean girar(int montoGiro){
if (cuentaBancaria==null){
throw new NullPointerException("Cuenta bancaria
no existe para hacer un giro");
}
else{
return cuentaBancaria.girar(montoGiro);
}
}
Aquí se podría
Se trabaja con excepciones para implementar tener la lógica
las precondiciones indicadas en los contratos del girar
Aquí se lanza la excepción
/**
* @see cl.ucn.ei.pa.proyectocuentabancaria.logica.
SistemaCuentaBancaria#obtenerDatosCuentaBancaria()
*/
public String obtenerDatosCuentaBancaria(){
if (cuentaBancaria==null){
throw new NullPointerException ("Cuenta bancaria
no existe");
}
return cuentaBancaria.toString();
}
}//Fin SistemaCuentaBancariaImpl
2.125
/**
* @author Loreto Telgie
* @version 1 septiembre 2016
*
*/
En la App se leen los datos y se
despliegan resultados
La App representa la interfaz para el
ingreso y despliegue de los datos
public class App { (podría ser una interfaz gráfica)
public static void main(String[] args) {
SistemaCuentaBancaria sistema =
new SistemaCuentaBancariaImpl(saldo);
try{
StdOut.println("Datos cuenta bancaria " +
sistema.obtenerDatosCuentaBancaria());
}catch(NullPointerException ex){
StdOut.println(ex.getMessage());
}
Se trabaja con excepciones para implementar
las precondiciones indicadas en los contratos
Aquí se está capturando la excepción
try {
sistema.depositar(74);
} catch(NullPointerException ex){
StdOut.println(ex.getMessage());
}
La cantidad a girar o depositar debiera
validarse en la App
2.126
try{
sistema.girar(20);
}catch(NullPointerException ex){
StdOut.println(ex.getMessage());
}
Se trabaja con excepciones para
implementar las precondiciones indicadas
en los contratos
Aquí se está capturando la excepción
try{
StdOut.println("Datos cuenta bancaria " +
sistema.obtenerDatosCuentaBancaria());
}catch(NullPointerException ex){
StdOut.println(ex.getMessage());
}
}//Fin main
} //Fin App
Diagrama de objetos
Si se ingresa como saldo inicial el
valor 100 cuentaBancaria: CuentaBancaria
saldo = 100
Se imprime 174
Saldo antes de las transacciones: 100
154
Antes de las transacciones: 154
Contratos
Operación Ingresar médico (rut, nombre,
regitro médico, especialidad) Nota
Descripción Se ingresa un médico La validación de los
datos de entrada
Precondiciones (cuando se lee) se hace
Postcondiciones Médico ingresado en la App.
Paciente
- String rut
- String nombre
- String diagnostico
- Medico medico
+ Paciente ()
+ setDiagnostico()
+ getMedico(): Medico
+ setMedico()
+ get y set....
+ toString(): String
Diagrama de clases <<interface>> 2.130
SistemaMedico
Los métodos de la
interfaz corresponden + ingresarMedico(String rut, String nombre)
a los contratos. + ingresar Paciente(String rut, String nombre)
Un método por + asociarDiagnostico(String diagnostico, String rut)
contrato + asociarMedico(String rutPaciente, String rutMedico)
+ obtenerDatosMedico(String rutMedico):String
+ obtenerDatosPacienteYSuMedico(String rutPaciente):String
<<implements>>
Medico
- String rut
- String nombre
1
- String registroMedico
- String especialidad
o 1 1
+ Medico()
+ get y set ….
+ toString();
SistemaMedicoImpl
Paciente
- Medico medico - String rut
- Paciente paciente 1 - String nombre
- String diagnostico
- Medico medico
+ Paciente ()
+ setDiagnostico()
+ getMedico(): Medico
+ setMedico()
+ get y set...
+ toString(): String
2.131
package cl.ucn.ei.pa.sistemamedico.dominio;
public class Medico {
private String rut;
private String nombre;
private String registroMedico;
private String especialidad;
public Medico(String rut, String nombre,
String registroMedico, String especialidad) {
this.rut = rut;
this.nombre = nombre;
this.registroMedico= registroMedico;
this.especialidad = especialidad;
}
public String getRut() {
return rut;
}
public void setRut(String rut) {
this.rut = rut;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getRegistroMedico() {
return registroMedico;
}
public void setRegistroMedico(String registroMedico) {
this.registroMedico = registroMedico;
}
public String getEspecialidad() {
return especialidad;
}
public void setEspecialidad(String especialidad) {
this.especialidad = especialidad;
}
@Override
public String toString() {
return "Medico [rut=" + rut + ", nombre=" + nombre +
", registroMedico=" + registroMedico + ",
especialidad="+ especialidad + "]";
}
}//Fin clase Medico
2.132
package cl.ucn.ei.pa.sistemamedico.dominio;
public class Paciente {
private String rut;
private String nombre;
private String diagnostico;
private Medico medico;
public Paciente(String rut, String nombre) {
this.rut = rut;
this.nombre = nombre;
this.diagnostico = null;
this.medico = null;
}
public String getRut() {
return rut;
}
public void setRut(String rut) {
this.rut = rut;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getDiagnostico() {
return diagnostico;
}
public void setDiagnostico(String diagnostico) {
this.diagnostico = diagnostico; Esta versión de toString()
} tiene seleccionada la opción
public Medico getMedico() { del eclipse “saltar valores
return medico; nulos”
}
public void setMedico(Medico medico){ Cuando un objeto está
this.medico = medico; asociado con otro, es
} preferible sobrescribir el
@Override toString que se obtiene con el
public String toString() { Eclipse
return "Paciente [" + (rut != null ? "rut=" + rut +
", " : "")+ (nombre != null ? "nombre=" + nombre +
", " : "")+ (diagnostico != null ? "diagnostico=" +
diagnostico + ", " : "")+
(medico != null ? "medico=" + medico : "") + "]";
}
}//Fin Paciente
2.133
package cl.ucn.ei.pa.sistemamedico.logica;
import cl.ucn.ei.pa.sistemamedico.dominio.*;
/**
* @author Loreto Telgie
*
*/
public interface SistemaMedico {
package cl.ucn.ei.pa.sistemamedico.logica;
import cl.ucn.ei.pa.sistemamedico.dominio.*;
/**
* @author Loreto Telgie
*
*/
public class SistemaMedicoImpl implements SistemaMedico{
}
2.135
package cl.ucn.ei.pa.sistemamedico.logica;
import cl.ucn.ei.pa.sistemamedico.dominio.*;
import cl.ucn.ei.pa.sistemamedico.logica.SistemaMedico;
import cl.ucn.ei.pa.sistemamedico.logica.SistemaMedicoImpl;
import ucn.StdOut;
En la App se leen los datos (deben
/**
* @author Loreto Telgie validarse) y se despliegan resultados
* La App representa la interfaz para el
*/ ingreso y despliegue de los datos
public class App {
(podría ser una interfaz gráfica)
public static void main(String[] args) {
SistemaMedico sistema = new SistemaMedicoImpl();
sistema.ingresarMedico(rutMedico,nombre,
registroMedico,especialidad);
sistema.ingresarPaciente(rutPaciente, nombre);
try{
sistema.asociarDiagnostico("Apendicitis", rutPaciente);
}catch(NullPointerException ex){
StdOut.println(ex.getMessage());
}
Los objetos se crean en la clase que
implementa la interfaz
Se debe trabajar sin objetos en la App,
sino que con los datos primitivos
2.136
try {
sistema.asociarMedico(rutPaciente, rutMedico);
}catch(NullPointerException ex){
StdOut.println(ex.getMessage());
}
try{
String datosMedico = sistema.obtenerDatosMedico(rutMedico);
StdOut.println("Datos del medico: "+ datosMedico);
}catch( NullPointerException ex){
StdOut.println(ex.getMessage());
}
try{
String datosPaciente =
sistema.obtenerDatosPacienteySuMedico(rutPaciente);
StdOut.println("Datos del paciente: " +
datosPaciente);
}catch( NullPointerException ex){
StdOut.println(ex.getMessage());
}
}//Fin main
}//Fin App
Diagrama de Objetos
rut=111-k rut=222-1
registroMedico=151-5 diagnostico=Apendicitis
especialidad=cardiologo medico
2.138
Ejemplo 3
Se necesita manejar información de un país y sus ciudades. Para un país
interesa saber su nombre, idioma y cantidad de habitantes. Para una ciudad,
su nombre, alcalde (suponga sólo 1 alcalde por ciudad) y cantidad de
habitantes. Se pide que haga un programa en Java que:
Ingrese el país Chile. Suponga que tiene 18.000.000 de habitantes.
Ingrese N ciudades de Chile, donde N se lee desde pantalla (lea desde
pantalla los datos de cada ciudad)
Una vez ingresada la información del país y sus ciudades, despliegue
todos los datos del país y los datos de cada una de sus ciudades.
Contratos
Operación Ingresar un país (nombre, idioma, cantidad habitantes pais)
Descripción Se ingresa un país
Precondiciones
Postcondiciones País creado
Versión 1
Diagrama de Clases del domino de la aplicación
1 0 .. *
Pais Ciudad
tiene
- String nombre
- String nombre
- String idioma
Un país podría - String alcalde
- int cantidadHabitantes
no tener - int cantidadHabitantes
- Ciudad [ ] listaCiudades
- int cantidadCiudades ciudades
+ Ciudad( )
+ Pais( ) + get y set….
+ get y set …. + toString():String
+ getCantidadCiudades(): int
+ getCiudadI(i): Ciudad
+ insertarCiudad():boolean
+ toString(): String
2.140
Diagrama de clases
<<interface>>
SistemaPaisCiudades
SistemaPaisCiudadesImpl
+ ingresarPais (nombre, idioma,
- Pais pais cantidadHabitantes)
+ obtenerDatosPaisCiudades(): String
+ obtenerPaisCiudades(): Pais
+ ingresarCiudadDeUnPais(nombre,
Uno de los 2 alcalde, cantidadHabitantes)
1
1 0 .. *
Pais Ciudad
- String nombre
- String nombre
- String idioma
- String alcalde
- int cantidadHabitantes
- int cantidadHabitantes
- Ciudad [ ] listaCiudades
- int cantidadCiudades
+ Ciudad( )
+ get y set….
+ Pais( )
+ toString(): String
+ get y set ….
+ getCantidadCiudades(): int
+ getCiudadI(i): Ciudad
+ insertarCiudad():boolean
+ toString(): String
2.141
package cl.ucn.ei.pa.paisciudades.dominio;
package cl.ucn.ei.pa.paisciudades.dominio;
public class Pais {
private String nombre;
private String idioma;
private int cantidadHabitantes;
private Ciudad [] listaCiudades;
private int cantidadCiudades;
private int max;
public Pais(String nombre, String idioma,
int cantidadHabitantes, int max) {
this.nombre = nombre;
this.idioma = idioma;
this.cantidadHabitantes = cantidadHabitantes;
listaCiudades = new Ciudad[max];
cantidadCiudades = 0;
this.max = max;
}
public final String getNombre() {
return nombre;
}
public final void setNombre(String nombre) {
this.nombre = nombre;
}
public final String getIdioma() {
return idioma;
}
2.143
return salida;
}
}
package cl.ucn.ei.pa.paisciudades.logica;
import cl.ucn.ei.pa.paisciudades.dominio.Pais;
}
2.145
package cl.ucn.ei.pa.paisciudades.logica;
import cl.ucn.ei.pa.paisciudades.dominio.*;
public class SistemaPaisCiudadesImpl implements
SistemaPaisCiudades {
private Pais pais;
public SistemaPaisCiudadesImpl() {
pais = null;
}
package cl.ucn.ei.pa.paisciudades.logica;
import ucn.StdOut;
import ucn.StdIn;
import cl.ucn.ei.pa.paisciudades.dominio.*;
public class App {
public static void
LeerCiudadesPais(SistemaPaisCiudades sistema){
nombre= Santiago
alcalde= Alessandri
cantidadHabitantes= 6000000
p: Pais
c: Ciudad
nombre = Chile
nombre= Antofagasta
idioma=Español
cantidadHabitantes=18000000 alcalde= Rojo
cantidadHabitantes= 400000
listaCiudades
cantCiudades= 3 c: Ciudad
nombre= Concepcion
alcalde= Ortiz
cantidadHabitantes= 1000000
2.149
Versión 2
Diagrama de clases del dominio de la aplicación
Pais Ciudad
- String nombre - String nombre
- String idioma - String alcalde
- int cantidadHabitantes - int cantidadHabitantes
- ListaCiudades listaCiudades + Ciudad( )
+ Pais( ) + get y set()…
+ get y set()…. + toString(): String
+ getListaCiudades(): ListaCiudades *
+ toString(): String
1
ListaCiudades
- Ciudad [] lc
- int cantidadCiudades
- int max
+ ListaCiudades( )
+ getCantidadCiudades(): int
+ insertarCiudad(): boolean
+ getCiudadI(i): Ciudad
+ toString(): String
2.150
Diagrama de clases
<<interface>>
SistemaPaisCiudades
SistemaPaisCiudadesImpl + ingresarPaisCiudades(nombre,
idioma, cantidadhabitantes)
- Pais p + ingresarCiudadDeUnPais (nombre,
alcalde, cantidadHabitantes)
+ obtenerDatosPaisCiudades(): String
Pais Ciudad
- String nombre - String nombre
- String idioma - String alcalde
- int cantidadHabitantes - int cantidadHabitantes
- ListaCiudades listaCiudades + Ciudad( )
+ Pais( ) + get y set()…
+ toString(): String
+ get y set()….
+ getListaCiudades(): ListaCiudades *
+ toString(): String
1
ListaCiudades
- Ciudad [] lc
- int cantidadCiudades
- int max
+ ListaCiudades( )
+ getCantidadCiudades(): int
+ insertarCiudad(): boolean
+ getCiudadI(i): Ciudad
+ toString(): String
2.151
package cl.ucn.ei.pa.paisciudades.dominio;
package cl.ucn.ei.pa.paisciudades.logica;
import cl.ucn.ei.pa.paisciudades.dominio.Ciudad;
public class ListaCiudades {
private Ciudad[] lc;
private int cantidadCiudades;
private int max;
public ListaCiudades(int max) {
lc = new Ciudad[max];
cantidadCiudades = 0;
this.max = max;
}
public int getCantidadCiudades() {
return cantidadCiudades;
}
public void setCantidadCiudades(int cantidadCiudades){
this.cantidadCiudades = cantidadCiudades;
}
public boolean insertarCiudad(Ciudad ciudad) {
if (cantidadCiudades < max) {
lc[cantidadCiudades] = ciudad;
cantidadCiudades++;
return true;
} else {
return false;
}
}
public Ciudad getCiudadI(int i) {
if (i >= 0 && i < cantidadCiudades) {
return lc[i];
} else {
return null; Para imprimir el contenedor, es mejor construir
} el método toString en vez del que se obtiene con
} Eclipse o NetBeans. La idea es ir obteniendo
@Override elemento por elemento del contendor
public String toString(){
return "ListaCiudades [" + (lc != null ? "lc=" +
Arrays.toString(lc) + ", " : "") +
"cantidadCiudades="+ cantidadCiudades + ", max=" +
max + "]";
}
}//Fin ListaCiudades
2.154
package cl.ucn.ei.pa.paisciudades.logica;
package cl.ucn.ei.pa.paisciudades.logica;
import cl.ucn.ei.pa.paisciudades.dominio.*;
public SistemaPaisCiudadesImpl() {
pais = null;
}
package cl.ucn.ei.pa.paisciudades.logica;
import ucn.StdOut;
import ucn.StdIn;
import cl.ucn.ei.pa.paisciudades.dominio.*;
import cl.ucn.ei.pa.paisciudades.logica.SistemaPaisCiudades;
import cl.ucn.ei.pa.paisciudades.logica.SistemaPaisCiudadesImpl;
sistema.ingresarPais("Chile","Espanol",17000000, N);
boolean ingreso =
sistema.ingresarCiudadDeUnPais(nombre,
alcalde, cantidad);
if(!ingreso){
StdOut.println("No se ingreso ciudad.
No hay espacio");
}
}
}
2.157
try {
StdOut.println(sistema.obtenerDatosPaisCiudades());
} catch (NullPointerException ex) {
StdOut.println(ex.getMessage());
}
}//Fin main
}//Fin App
2.158
Ejemplo 4
Precondiciones
Precondiciones
Postcondiciones
1
Pais Ciudad
- String nombre - String nombre
- int cantidadHabitantes - int cantidadUniversidades
- String idioma - int cantidadMuseos
- String continente - Pais pais
- ListaCiudades listaCiudades + Ciudad()
+ Pais() + get y set …
+ get y set… + setPais()
+ getListaCiudades(): ListaCiudades + getPais(): Pais
+ setListaCiudades() + toString(): String
+ toString():String
*
*
1
ListaPaises ListaCiudades
- Pais [] lp - Ciudad [] lc
- int cantidadPaises - int cantidadCiudades
+ ListaPaises() - int max
+ ingresarPais(): boolean + ListaCiudades()
+ buscarPais(): Pais + ingresarCiudad():boolean
+ buscarCiudad(): Ciudad
+ getCantidadPaises(): int + getCantidadCiudades():int
+ getPaisI(): Pais + getCiudadI(): Ciudad
+ toString():String + toString():String
2.162
Diagrama de clases <<interface>>
SistemaPaisesCiudades
<<implements>>
+ ingresarPais(nombre, habitantes, idioma,
SistemaPaisesCiudadesImpl Continente, cantidadCiudades): boolean
+ingresarCiudad(nombre, universidades, museos):boolean
+asociarPaisCiudad(nombrePais, nombreCiudad)
- ListaPaises listaPaises
+ encontrarCiudadesPais(nomPais):String
- ListaCiudades listaCiudades + obtenerCantidadPaisesEuropeos():int
+ obtenerPaisMasHabitantes(): String
+encontrarPaisDeUnaCiudad(nomCiudad):String
1
Pais Ciudad
- String nombre
- String nombre
- int cantidadUniversidades
- int cantidadHabitantes
- int cantidadMuseos
- String idioma
- Pais pais
- String continente
- ListaCiudades listaCiudades + Ciudad()
+ get y set …
+ Pais() + setPais()
+ get y set… + getPais(): Pais
+ getListaCiudades(): ListaCiudades + toString():String
+ setListaCiudades()
+ toString(): String
*
*
1 1
ListaPaises ListaCiudades
- Pais [] lp - Ciudad [] lc
- int cantidadPaises - int cantidadCiudades
+ ListaPaises() - int max
+ ingresarPais(): boolean + ListaCiudades()
+ buscarPais(): Pais + ingresarCiudad():boolean
+ getCantidadPaises: int + buscarCiudad(): Ciudad
+ getPaisI(): Pais + getCantidadCiudades():int
+ getCiudadI();
+ toString(): String
+ toString(): String
1
2.163
package cl.ucn.ei.pa.sistemapaisesciudades.dominio;
//@Override
public String toString() {
return "Ciudad [" + (nombre != null ? "nombre=" + nombre +
", " : "") +
"cantidadUniversidades="+ cantidadUniversidades +
", cantidadMuseos=" + cantidadMuseos + "]";
}
package cl.ucn.ei.pa.sistemapaisesciudades.dominio;
import cl.ucn.ei.pa.sistemapaisesciudades.logica.ListaCiudades;
package cl.ucn.ei.pa.sistemapaisesciudades.logica;
import cl.ucn.ei.pa.sistemapaisesciudades.dominio.Ciudad;
}
2.168
package cl.ucn.ei.pa.sistemapaisesciudades.logica;
import cl.ucn.ei.pa.sistemapaisesciudades.dominio.Pais;
package cl.ucn.ei.pa.sistemapaisesciudades.logica;
import cl.ucn.ei.pa.sistemapaisesciudades.dominio.*;
package cl.ucn.ei.pa.sistemapaisesciudades.logica;
import ucn.StdOut;
import ucn.StdIn;
import cl.ucn.ei.pa.sistemapaisesciudades.logica.SistemaPaisesCiudades;
import cl.ucn.ei.pa.sistemapaisesciudades.logica.SistemaPaisesCiudadesImpl;
LeerPaisesCiudades(sistema, cantidadPaises);
try{
StdOut.println("Pais " +
sistema.paisDeterminadaCiudad(nombreCiudad));
} catch (IllegalArgumentException ex) {
StdOut.println(ex.getMessage());
}
ingreso = sistema.ingresarCiudad(nombreCiudad,
cantidadUniversidades, cantidadMuseos);
//Se ingresa la ciudad a la lista de todas
//las ciudades
if (!ingreso){
StdOut.println("No se ingreso la ciudad.
No hay espacio");
}
else{
try{
sistema.asociarPaisCiudad(nombrePais,
nombreCiudad);
//Se asocia el pais y la ciudad
}catch(IllegalArgumentException ex){
StdOut.println(ex.getMessage());
}
}
}
}
}
}
}
2.175
Si los datos se leen de la siguiente forma:
1°. Cantidad de países, cantidad de ciudades
2°. Por cada país los datos del país
3°. Por cada ciudad, los datos de la ciudad, incluyendo el nombre del pais
al que pertenece
Los contratos ingresarCiudad y asociarPaisCiudad, asociados al ingreso de
los datos serían reemplazados por los siguientes:
Parte de la App
public static void main(String[] args) {
StdOut.print("Ingrese cantidad de paises: ");
int cantidadPaises = StdIn.readInt();
StdOut.print("Ingrese cantidad de ciudades: ");
int cantidadCiudades = StdIn.readInt();
SistemaPaisesCiudades sistema =
new SistemaPaisesCiudadesImpl(cantidadPaises,
cantidadCiudades);
LeerPaises(sistema, cantidadPaises);
LeerCiudades(sistema, cantidadCiudades);
……
2.178
2.8.1. Concepto
Se permite definir una nueva clase B, como una extensión de una clase
previa A.
B se denomina subclase de A y A se denomina superclase de B
B es la Clase derivada y A es la Clase base
Una subclase típicamente aumenta o redefine la estructura existente y el
comportamiento de su superclase.
Ejemplos: Figura
Cuenta Bancaria
Persona
Empleado Alumno
Ejemplo
Se tiene una jerarquía de clases, formada por una clase base (Persona) y dos
clases derivadas (Empleado y Alumno), junto a la correspondiente
definición de las propiedades, variables de instancia, y métodos, de cada
una de ellas.
Como las clases Empleado y Alumno heredan propiedades de la superclase
Persona, los objetos asociados a estas clases tienen las propiedades definidas
para la clase propiamente tal, y las heredadas de la clase Persona.
2.181
Superclase Persona, con subclase Alumno y Empleado
Persona
Alumno Empleado
Persona
Variables de instancia:
- nombre
- direccion
- fecha de nacimiento
Métodos:
- Inic-datos-persona
- Informa-datos-persona
Empleado Alumno
Variables de instancia: Variables de instancia:
- num-empleado - num-alumno
- sueldo - carrera
Métodos: Métodos:
- Inic-datos-empleado - Inic-datos-alumno
- Informa-sueldo - Informa-carrera
Empleado Empleado
Variables de instancia: Variables de instancia:
- num-empleado - nombre
- sueldo
- sueldo - direccion
- fecha-nacimiento
Métodos:
- Inic-datos-empleado - num_empleado
- Informa-sueldo Métodos:
- Inic-datos-persona
+ - Informa-datos-persona
PERSONA - Inic-datos-empleado
- Informa-sueldo
Alumno Alumno
Variables de instancia: Variables de instancia:
- num-alumno - nombre
- carrera - direccion
Métodos - fecha-nacimiento
- Inic-datos-alumno - num-alumno
- Informa-carrera - carrera
Métodos:
+ - Inic-datos-persona
PERSONA - Informa-datos-persona
- Inic-datos-alumno
- Informa-carrera
Notación
La representación de la herencia, de acuerdo a la notación utilizada por
UML.
Superclase
Subclase1 Subclase2
Ejemplos:
Cuenta
Bancaria
Cuenta Cuenta
Ahorro Corriente
2.186
Equipo
Intercambiador
Bomba Estanque
de Calor
Estanque Estanque
.......
Esférico a Presión
Figura
Cuadrado
2.187
Mensajes a super
Resultado: x = 10 y = 20 z = 30
p = Punto3D @ 1cc807
Clase del Dirección
Objeto
2.190
public class A {
private int dato; A
- int dato
public A(int dato) {
+ A()
this.dato = dato; + m1(int x): int
} + get y set()…
public int getDato() {
StdOut.println("Pasa por getDato() del padre");
return dato;
} B
public void setDato(int dato) { - int dato
this.dato = dato;
} + B()
public int m1(int x) { + m1(int dato): int
StdOut.println("Pasa por m1 del padre"); + m2(): int
return x + 5; + get y set()…
}
}
int dx = this.getX() - x;
//Se tiene que usar el getX(), porque es private
int dy = this.getY() - y;
int dz = this.z - z;
return Math.sqrt(dx*dx + dy*dy + dz*dz);
}
}
2.193
public class Punto3DDist {
public static void main(String[] args) {
Punto3D p1 = new Punto3D(30, 40, 10);
Punto3D p2 = new Punto3D(0, 0, 0);
Punto p = new Punto(4, 6);
p2: Punto3D p: Punto p1: Punto3D
x=0 x=4 x = 30
y=0 y=6 y = 40
z=0 z = 10
StdOut.println("p1 = " + p1.getX() + ", " + p1.getY() +
", " + p1.getZ());
StdOut.println("p2 = " + p2.getX() + ", " + p2.getY() +
", " + p2.getZ());
StdOut.println("p = " + p.getX() + ", " + p.getY());
StdOut.println("------------------------------");
StdOut.println("p1.distancia(p2) = " + p1.distancia(p2));
StdOut.println("------------------------------");
StdOut.println("p1.distancia(4, 6)=" + p1.distancia(4,6));
StdOut.println("------------------------------");
StdOut.println("p1.distancia(p) = " + p1.distancia(p));
}
}
Se imprime
p1 = 30, 40, 10
p2 = 0, 0, 0
p = 4, 6
------------------------------
Segundo metodo distancia del hijo Punto3D. Parametros:
Punto3D
Primer metodo distancia del hijo Punto3D. Parametros: x, y, z
p1.distancia(p2) = 50.99019513592785
------------------------------
Tercer metodo distancia del hijo Punto3D. Parametros: x, y
p1.distancia(4, 6) = 2.23606797749979
------------------------------
Segundo metodo distancia del padre Punto. Parametros: Punto
Tercer metodo distancia del hijo Punto3D. Parametros: x, y
p1.distancia(p) = 2.23606797749979
2.194
Notas:
Hay una tensión importante, entre la herencia y el encapsulamiento.
Polimorfismo en Java:
Se imprime
p2 = 0, 0, 0
p4 = 40, 50
p5 = 40, 50, 60
------------------------------
Segundo metodo distancia del padre (Punto). Parametros: Punto
Tercer metodo distancia del hijo Punto3D. Parametros: x, y
p4.distancia(p2) = 1.0671873729054748
------------------------------
Segundo metodo distancia del hijo Punto3D. Parametros: Punto3D
Primer metodo distancia del hijo Punto3D. Parametros: x, y, z
p5.distancia(p2) = 87.74964387392122
------------------------------
Primer metodo distancia del hijo Punto3D. Parametros: x, y, z
p5.distancia(1,1,2) = 85.3580693314932
------------------------------
2.197
2.8.3. Clase abstracta
A) Conceptos
Algunas de las clases tendrán instancias, otras no.
La clase que no tienen instancias, se denomina clases abstractas.
Una clase abstracta es escrita con el propósito de que sus subclases le agreguen estructura y
comportamiento, a través de completar la implementación de sus (usualmente) métodos
incompletos.
No se pueden crear instancias de dichas clases directamente, con el operador new.
Ejemplo:
Se desea construir una aplicación que manipula figuras (círculos, triángulos y rectángulos) en un
sistema gráfico, en base a las siguientes operaciones:
Indicar ubicación de una figura.
Dibujar una figura en el terminal. Para que una clase se defina como
Imprimir una figura. abstracta debe tener al menos un método
Rotar una figura. abstracto. Sino lo tiene, no necesita ser
Indicar el color de una figura. abstracta
Las características del modelo orientado al objeto para definir clases y hacer explícitas las
propiedades comunes de las clases mediante el mecanismo de la herencia, permite obtener la
siguiente jerarquía de clases como solución al problema.
Figura
Clase Abstracta Figura
<<abstracta>>
Figura Rectángulo
Variables de instancia: Variables de instancia:
Centro Vértices
Color
Métodos: Métodos:
Ubicar Dibujar
Dibujar Imprimir
Imprimir Rotar
Métodos Abstractos
Rotar
Color Circulo
Variables de instancia:
Triángulo
Variables de instancia: Radio
Limites
Métodos:
Métodos:
Dibujar
Dibujar
Imprimir
Imprimir
Rotar
Rotar
2.198
Debe hacerse notar, que las clases Rectángulo, Triángulo y Círculo,
sobrescriben los procedimientos Dibujar, Imprimir y Rotar, los que son
específicos para cada una de las clases. En esta solución, según sea el
tipo de la información que se está procesando, se ejecuta el
procedimiento adecuado para la situación que se presenta; por ejemplo, si
el método Rotar se aplica a un objeto de la clase Rectángulo, el método
asociado a esa clase es ejecutado.
Para extender o reusar el sistema, basta con crear una subclase dentro de
la jerarquía de clases mostrada anteriormente, que agregue o modifique
propiedades de la superclase, sin necesidad de modificar las clases
existentes.
Rotar
Cuadrado Dibujar
Método Abstracto
Es un método cuya implementación no es definida en la declaración de la
clase en que aparece. Su definición se hace en una clase descendente.
final asociado a un método, indica que este no puede ser sobrescrito por
las subclases.
final, usado como modificador de una clase, indica que la clase no puede
tener subclases.
Contratos
Operación depositar (monto depósito) Recuerde que el
chequeo del monto
Descripción Se deposita dinero en la cuenta corriente y del depósito > 0 es
en la cuenta de ahorro
validación del dato de
Precondiciones Que exista la cuenta corriente entrada. Se hace en
Que exista la cuenta de ahorro la App
Postcondiciones Saldo actualizado de la cuenta corriente Por lo tanto no va en
Saldo actualizado de la cuenta de ahorro el contrato
2.202
CuentaBancaria
- double $ tasaInteres
- int saldo
El depositar y girar + CuentaBancaria()
podrían estar solo en + $ getTasaInteres(): double
la clase que + $ setTasaInteres()
implementa la + depositar(): int
interfaz, de manera + girar(): int
que la clase + getSaldo(): int
CuentaBancaria, + setSaldo()
quede solo con los get
y set
CuentaCorriente CuentaAhorro
- int $ corrNumero - int $ corrNumero
- int numeroCuenta - int numeroCuenta
+ CuentaCorriente() + CuentaAhorro()
+ getNumeroCuenta(): int + getNumeroCuenta(): int
2.204
Diagrama de clases CuentaBancaria
- double $ tasaInteres
- int saldo
+ CuentaBancaria()
+ $ getTasaInteres(): double
+ $ setTasaInteres()
+ depositar(): boolean
+ girar(): boolean
+ getSaldo(): int
+ setSaldo()
CuentaCorriente CuentaAhorro
- int $ corrNumero - int $ corrNumero
- int numeroCuenta - int numeroCuenta
+ CuentaCorriente() + CuentaAhorro()
+ get y set NumeroCuenta()… + get y set NumeroCuenta()…
+ $ getCorrNumero(): int + $ getCorrNumero(): int
+ $ setCorrNumero() + $ setCorrNumero()
1 1
SistemaCuentaCorrienteCuentaAhorroImpl
CuentaCorriente cuentaCorriente
CuentaAhoro cuentaAhorro
<<implements>>
SistemaCuentaCorrienteCuentaAhorro
<<interface>>
+ chequearTasaInteres(tasaInteres)
+ obtenerDatosCuentaCorriente(): String
+ obtenerDatosCuentaAhorro(): String
+ depositar(monto)
+ descontarMantencion()
+ agregarInteres(tasaInteres)
2.205
package cl.ucn.ei.pa.sistemacuentaahorrocuentacorriente.dominio;
@Override
public String toString() {
return "CuentaBancaria [saldo=" + saldo + "]";
}
}
package cl.ucn.ei.pa.sistemacuentaahorrocuentacorriente.dominio;
@Override
public String toString() {
return "CuentaAhorro [numeroCuenta=" + numeroCuenta +
", saldo=" + getSaldo() + "]";
package cl.ucn.ei.pa.sistemacuentaahorrocuentacorriente.dominio;
@Override
public String toString() {
return "CuentaCorriente [numeroCuenta=" + numeroCuenta +
", saldo= "+ getSaldo()+"]" ;
}
package cl.ucn.ei.pa.sistemacuentaahorrocuentacorriente.logica;
}
2.209
package cl.ucn.ei.pa.sistemacuentaahorrocuentacorriente.logica;
import cl.ucn.ei.pa.sistemacuentaahorrocuentacorriente.dominio.*;
public SistemaCuentaCorrienteCuentaAhorroImpl(){
//Cuando se levanta el sistema, se crean las
//2 cuentas con un saldo 0
cuentaAhorro = new CuentaAhorro(0);
cuentaCorriente = new CuentaCorriente(0);
}
package cl.ucn.ei.pa.sistemacuentaahorrocuentacorriente.logica;
import ucn.StdIn;
import ucn.StdOut;
SistemaCuentaCorrienteCuentaAhorro sistema =
new SistemaCuentaCorrienteCuentaAhorroImpl();
try{
StdOut.println("datos cuenta corriente: + " +
sistema.obtenerDatosCuentaCorriente());
}catch(NullPointerException ex){
StdOut.println(ex.getMessage());
}
StdOut.println();
try{
StdOut.println("datos cuenta ahorro: + " +
sistema.obtenerDatosCuentaAhorro());
}catch(NullPointerException ex){
StdOut.println(ex.getMessage());
}
StdOut.println();
2.212
}
2.213
Ejemplo 2: Vehículos
Construir un programa que maneje información de vehículos. Un vehículo
tiene un número de patente, marca y año de fabricación.
Entre los vehículos es posible distinguir los autos y las camionetas. Para los
autos se tiene además, la lectura del cuenta kilómetros y la capacidad del
estanque de combustible. Para las camionetas se tiene además, su capacidad
de carga.
Se pide:
Modelo del dominio
Contratos
Diagrama de clases del dominio de la aplicación
Diagrama de clases
Código Java
2.214
Modelo del dominio
Auto Camioneta
Patente Patente
Marca Marca
Año
Año
Lectura cuenta kilómetros
Capacidad estanque combustible Capacidad de carga
Contratos
Operación Ingresar camioneta (patente, marca, año, capacidad carga)
Descripción Se ingresa una camioneta a la lista general de vehículos
Precondiciones
Postcondiciones Camioneta ingresada a la lista general de vehículos
10
Camioneta Auto
- int capacidadCarga - int kilometraje
- int capacidadEstanque
+ Camioneta() + Auto()
+get y set ... + get y set ….
+ costoReparacion(): int + costoReparacion(): int
+ toString() + toString(): String
+
Recuerde que si una clase tiene un método
abstracto, tiene que ser abstracta. De hecho, sino
la define como abstracta arroja un error de
compilación
2.217
Diagrama de clases
Vehículo
ListaVehiculos * << abstract>>
- Vehiculo [ ] lv - String patente
- int cantidadVehiculos - String marca
- int max - int agno
# Vehiculo()
+ listaVehiculos()
+ getMarca(): String
+ ingresarVehiculo(): boolean + getAgno (): int
+ getCantidadVehiculos(): int + getPatente(): String
+ getVehiculoI(i): Vehiculo + abs costoReparacion(): int
+ buscarVehiculo(): Vehiculo + toString(): String
+ toString()
1 Camioneta Auto
- int capacidadCarga - int kilometraje
- int capacidadEstanque
+ Camioneta() + Auto()
+get y set ... + get y set ….
+ costoReparacion(): int + costoReparacion(): int
+ toString() + toString(): String
+
SistemaVehiculos
<<interface>>
+ingresarAuto(): boolean
+ingresarCamioneta(): boolean
+obtenerDatosVehiculos(): String
+obtenerDatosVehiculo (): String
+obtenerTotalAutos(): int
+obtenerTotalCamionetas(): int
+obtenerTotalVehiculos(): int
+obtenerDatosCamionetaMasCarga(): String
<<implements>>
SistemaVehiculosImpl
ListaVehiculos listaVehiculos
2.218
package cl.ucn.ei.pa.sistemavehiculos.dominio;
@Override
public String toString() {
return "Vehiculo [" + (patente != null ?
"patente=" + patente + ", " : "")+
(marca != null ? "marca=" + marca + ", " : "")+
"agno=" + agno + "]";
}
}
2.219
package cl.ucn.ei.pa.sistemavehiculos.dominio;
public class Auto extends Vehiculo{
private int kilometraje;
private int capacidadEstanque;
public Auto(String patente, String marca, int agno,
int kilometraje, int capacidadEstanque) {
super(patente , marca , agno);
this.capacidadEstanque = capacidadEstanque;
this.kilometraje=kilometraje;
}
public int getKilometraje() {
return kilometraje;
}
public int getCapacidadEstanque() {
return capacidadEstanque;
}
public int costoReparacion () {
return (capacidadEstanque * 20000);
}
@Override
public String toString() {
return "patente: "+ getPatente() + " marca: "+
getMarca()+ " agno: " + getAgno()+ " " +
"Auto [kilometraje=" + kilometraje +
", capacidadEstanque=" + capacidadEstanque + "]";
}
}
2.220
package cl.ucn.ei.pa.sistemavehiculos.dominio;
public class Camioneta extends Vehiculo{
private int capacidadCarga;
public Camioneta (String patente, String marca,
int agno, int capacidadCarga) {
super(patente, marca, agno);
this.capacidadCarga = capacidadCarga;
}
@Override
public String toString() {
return "patente: "+ getPatente() + " marca: "+
getMarca()+ " agno: " + getAgno()+ " Camioneta
[capacidadCarga=" + capacidadCarga + "]";
}
}
2.221
package cl.ucn.ei.pa.sistemavehiculos.logica;
import cl.ucn.ei.pa.sistemavehiculos.dominio.Auto;
import cl.ucn.ei.pa.sistemavehiculos.dominio.Camioneta;
import cl.ucn.ei.pa.sistemavehiculos.dominio.Vehiculo;
public class ListaVehiculos {
private Vehiculo[ ] lv;
private int cantidadVehiculos;
int max;
public ListaVehiculos(int max) {
lv = new Vehiculo [max];
cantidadVehiculos =0;
this.max = max;
}
public int getCantidadVehiculos() {
return cantidadVehiculos;
}
public Vehiculo getVehiculoI (int i) {
if (i >= 0 && i < cantidadVehiculos){
return lv[i];
}
return null;
}
@Override
public String toString() {
String salida = "";
for(int i = 0; i < cantidadVehiculos; i++){
Vehiculo vehiculo = getVehiculoI(i);
package cl.ucn.ei.pa.sistemavehiculos.logica;
import cl.ucn.ei.pa.sistemavehiculos.dominio.*;
}
2.224
package cl.ucn.ei.pa.sistemavehiculos.logica;
import cl.ucn.ei.pa.sistemavehiculos.dominio.*;
public SistemaVehiculosImpl(){
listaVehiculos = new ListaVehiculos(10);
}
return ingreso;
}
2.225
for(int i=0;
i<listaVehiculos.getCantidadVehiculos();i++){
Vehiculo vehiculo =
listaVehiculos.getVehiculoI(i);
Vehiculo vehiculo =
listaVehiculos.getVehiculoI(i);
if (vehiculo instanceof Camioneta){
Camioneta camioneta = (Camioneta) vehiculo;
if (camioneta.getCapacidadCarga()> mayor){
mayor = camioneta.getCapacidadCarga();
camionetaMasCarga = camioneta;
}
}
}
if(camionetaMasCarga != null){
return camionetaMasCarga.toString();
}
else{
return null;
}
}
}
2.228
package cl.ucn.ei.pa.sistemavehiculos.logica;
import cl.ucn.ei.pa.sistemavehiculos.dominio.*;
import ucn.StdIn;
import ucn.StdOut;
else {
if (tipo == 2) {
StdOut.print("Ingrese patente = ");
patente = StdIn.readString();
StdOut.print("Ingrese la marca =");
marca = StdIn.readString();
StdOut.print("Ingrese agno fabricacion= ");
agno = StdIn.readInt();
StdOut.print("Ingrese capacidad carga = ");
int capacidadCarga = StdIn.readInt();
boolean ingreso =
sistema.ingresarCamioneta(patente,
marca, agno, capacidadCarga);
if(!ingreso){
StdOut.println("No se hizo el ingreso
de la camioneta. No hay espacio");
}
}
}
}
case 1:
leerUnVehiculo (sistema);
break;
case 2:
StdOut.println(" ");
StdOut.println(sistema.
obtenerDatosVehiculos());
break;
case 3:
StdOut.print("Patente a buscar: ") ;
String patente = StdIn.readString();
try{
StdOut.println(" ");
StdOut.println(sistema.
obtenerDatosVehiculo(patente));
}catch (NullPointerException ex) {
StdOut.println(ex.getMessage());
}
break;
2.231
} //fin switch
desplegarMenu();
StdOut.print("Ingrese opcion:");
opcion = StdIn.readInt();
}
}
m1()
v m2() c
m3()
Camioneta Auto
-int capacidadCarga - int kilometraje
+ Camioneta() - int capacidadEstanque
+ m3() + Auto()
+ m4()
v1
¿Desde qué punto de vista quiero ver al objeto: como camioneta o como
vehículo?
Si se ve como vehículo, sólo puedo ver los métodos m1 y m2.
Se puede achicar la interface del objeto (Vehiculo tiene menos cosas que
camioneta)
√√ Vehiculo v1 = c
√√Vehiculo v1 = (Vehiculo) c;
Si se ve como camioneta, se deben ver los métodos m1, m2 y m3.
No se puede agrandar la interface del objeto (Camioneta tiene más cosas
que Vehiculo)
Camioneta c = v
Programador Analista
- String lenguaje - int anosExperiencia Ingeniero
- int horasExtras - int $ porcentajePorProyecto=25 - String titulo
- int nivel
- int $ porcentajePorProyecto=20 + Analista() - int cantidadCargas
+ calcularSueldo(): int - int $ porcentajePorProyecto=30
+ Programador()
+ calcularSueldo(): int + get y set… + Ingeniero()
+ get y set ….
+ calcularSueldo(): int
1 1 + get y set…
Proyecto
- int codigo
- int meses 1
- String nombre 1
- int monto
- Funcionario ingeniero ListaProyectos
- Funcionario analista
- Funcionario programador - Proyecto[] lp
+ Proyecto() * - int cantidadProyectos
+ getCodigo(): int
+ getNombre(): String + ListaProyectos()
+ getMonto(): int + ingresar(): boolean
+ getMeses(): int
+ setIngeniero() + buscar(): Proyecto
+ setAnalista() + getCantidadProyectos(): int
+ setProgramador() + getProyectoI(i): Proyecto
+ getIngeniero(): Funcionario
+ getAnalista(): Funcionario
+ getProgramador(): Funcionario
2.237
Contratos
1 1
SistemaProyectosFuncionariosImpl
ListaProyectos listaProyectos
ListaFuncionarios listaFuncionarios
<<implements>>
SistemaProyectosFuncionarios
<<interface>>
+ ingresarAnalista(rut, nombre, direccion, sueldoBase, agnosExperiencia): boolean
+ ingresarProgramador(rut, nombre, direccion, sueldoBase, lenguajeProgramacion,
horasExtra, nivelProgramador): boolean
+ ingresarIngeniero(rut,nombre,direccion,sueldoBase,titulo,cantidadCargas):boolean
+ ingresarProyecto(codigo, nombre, monto, meses): boolean
+ asociarFuncionarioProyecto ( codigoProyecto, rut);
+ obtenerDatosProyectos(): String
+ obtenerDatosFuncionarios(): String
+ obtenerDatosFuncionariosProyecto(): String
+ obtenerDatosProyectosFuncionario(rut):String
+ obtenerDatosIngenieros(): String
2.241
package cl.ucn.ei.pa.sistemaFuncionariosProyectos.dominio;
import cl.ucn.ei.pa.sistemaFuncionariosProyectos.logica.ListaProyectos;
package cl.ucn.ei.pa.sistemaFuncionariosProyectos.dominio;
import cl.ucn.ei.pa.sistemaFuncionariosProyectos.logica.ListaProyectos;
public class Programador extends Funcionario {
private String lenguaje;
private int horasExtra;
private int nivel;
package cl.ucn.ei.pa.sistemaFuncionariosProyectos.dominio;
package cl.ucn.ei.pa.sistemaFuncionariosProyectos.logica;
import cl.ucn.ei.pa.sistemaFuncionariosProyectos.dominio.Proyecto;
package cl.ucn.ei.pa.sistemaFuncionariosProyectos.logica;
}
2.252
package cl.ucn.ei.pa.sistemaFuncionariosProyectos.logica;
import cl.ucn.ei.pa.sistemaFuncionariosProyectos.dominio.*;
public SistemaFuncionariosProyectosImpl() {
this.listaProyectos = new ListaProyectos(6);
this.listaFuncionarios=new ListaFuncionarios(30);
}
Funcionario funcionario =
listaFuncionarios.getFuncionarioI(i);
}
2.257
package cl.ucn.ei.pa.sistemaFuncionariosProyectos.logica;
import java.io.IOException;
import ucn.ArchivoEntrada;
import ucn.Registro;
import ucn.StdIn;
import ucn.StdOut;
public class App {
leerProyectos(sistema);
leerFuncionarios(sistema);
leerPersonalProyectos(sistema);
StdOut.println(sistema.obtenerDatosProyectos());
StdOut.println(sistema.obtenerDatosFuncionarios());
StdOut.println(sistema.obtenerDatosIngenieros());
}
2.258
else {//Ingeniero
String rut = registro.getString();
String nombre = registro.getString();
String direccion = registro.getString();
int sueldoBase=registro.getInt();
String titulo = registro.getString();
int cantidadCargas=registro.getInt();
ingreso = sistema.ingresarIngeniero(rut, nombre,
direccion,sueldoBase,titulo,cantidadCargas);
if(!ingreso) {
StdOut.println("No hay espacio para mas");
}
}
}
}
archivo.close();
StdOut.println("Terminado de leer el archivo Funcionarios");
}
}
2.261
2.9. Visibilidad de clases y control de acceso para los miembros
de una clase
A) Visibilidad de clases
Si la clase no es pública, entonces la clase sólo puede ser usada dentro del
paquete que la contiene.
Java soporta cuatro niveles de acceso para las variables y los métodos de una
clase:
private
protected
public
package (sin modificador)
2.262
Control de acceso para los miembros de una clase
PRIVADO:
Es el nivel de acceso más restrictivo. Un miembro privado es accesible sólo
en la clase en la que se encuentra definido.
Ejemplo: private
PROTECTED:
Permite que la clase, que las subclases, y que todas las clases en el mismo
paquete tengan acceso al miembro declarado como protegido.
Ejemplo: protected
package Greek;
public class Alpha {
protected int soyProtegido;
protected void metodoProtegido() {
StdOut.println(“Metodo protegido”);
}
}
package Greek;
public class Gamma {
void metodoAcceso() {
Alpha a = new Alpha();
a.soyProtegido = 10; //legal
a.metodoProtegido(); //legal
}
}
2.264
En el caso de una subclase A que reside en un paquete diferente, esta
subclase A puede referenciar los miembros protegidos de la clase B sólo en
el caso de aquellos objetos de la subclase A o de subclases de A.
import Greek.*;
package Latin;
PUBLIC:
Cualquier clase en cualquier paquete, tiene acceso a los miembros públicos
de la clase.
Ejemplo: public
package Greek;
PACKAGE:
Si un miembro de una clase no tiene modificador, entonces será visible a
todas las clases del mismo paquete. Esto es lo establecido por defecto.
Ejemplo: package
package Greek;
public class Alpha {
int soyUnPaquete;
void metodoPaquete() {
StdOut.println(“Método Paquete”);
}
}
package Greek
public class Beta {
void metodoAcceso() {
Alpha a = new Alpha();
a.soyUnPaquete = 10; //legal
a. metodoPaquete(); //legal
}
}
2.266
C) Resumen de los atributos que pueden tener variables
y métodos
VARIABLE:
{final}
{static}
MÉTODO:
{final / abstract}
{static}
package P1;
Además, la empresa cuenta con un conjunto de vehículos, los que pueden ser
asignados a los empleados (máximo un vehículo por empleado). Para cada
vehículo se registra:
Código
Fecha de su última mantención
Fecha de expiración de la revisión técnica
Lectura del cuenta kilómetros
Capacidad del estanque de combustible
Algunos empleados trabajan con contrato por horas. A ellos se les contrata
por una cierta cantidad de horas mensuales y se acuerda con cada uno el
precio a cancelar por hora. En el momento de pagarles se verifica la
cantidad total de horas trabajadas en el mes y si se registran horas de sobre
tiempo, se les paga 1,5 veces su precio normal por cada hora extra.
Se necesita: