Upload
rayhino
View
215
Download
0
Embed Size (px)
Citation preview
8/16/2019 Teoria_ClasesJAVA
1/30
1
CAPÍTULO 5:POO
EN JAVA
PROGRAMACIÓN
ORIENTADA A OBJETOSCON JAVA
8/16/2019 Teoria_ClasesJAVA
2/30
8/16/2019 Teoria_ClasesJAVA
3/30
3
DISEÑO DE CLASES1. Descripción del problema. Nos describe el sistema que debemos modelar.
Es imposible ofrecer una solución satisfactoria sin un total conocimiento del
problema.2. Encontrar los objetos principales. Buscar los elementos más importantes
del modelo. Recomendación: hacer una lista de todos los nombres queaparecen en la descripción del problema y elegir aquellos que nos parezcan
más importantes.
3. Determinar el comportamiento deseado para cada uno de los objetos principales. Este paso producirá el conjunto de métodos necesarios en lasclases a las que esos objetos pertenecen. Si necesitamos varias clases, lastrataremos una a una.
4. Determinar la interfaz. Estableceremos el prototipo de cada método: sus
argumentos y tipo de retorno. Recomendación: escribir un código de ejemploque utilice el objeto y que muestre cómo deberían ocurrir las invocaciones de
una forma natural.
5. Definir los atributos e implementar los métodos. A menudo concluiremoscon una justificación de la solución propuesta.
6. Determinar las relaciones con otras clases.
8/16/2019 Teoria_ClasesJAVA
4/30
4
DISEÑO DE CLASES
Identificación declases y objetos
Identificación delas semánticas declases y objetos
Identificación delas relaciones declases y objetos
Especificación deinterfaces e
implementación declases y objetos
8/16/2019 Teoria_ClasesJAVA
5/30
5
EJEMPLO POO PEAJE
• Definición del problema:
– El organismo encargado de las autopistas de undeterminado país está instalando un sistema decobro de peajes en una de sus carreteras más
importantes. – Los camiones que llegan a una cabina de peaje
deben pagar 5 € por eje y 2 € por cada tonelada de peso.
– Una pantalla en la cabina de peaje muestra lacantidad del total de recibos cobrados y la cantidadde camiones que han pagado desde la últimarecaudación.
8/16/2019 Teoria_ClasesJAVA
6/30
6
• Un escenario de ejemplo:
Para ayudar a diseñar el sistema, imaginemos como funcionaría un sistema decobro de peaje de esta naturaleza:
Un agente de peajes espera en la cabina con una pantalla y un lector decódigos de barras. Cuando llega un camión, el agente lee el código de barrasdel camión con sus datos.
La información del camión y el importe del peaje se muestra en la pantalladel ordenador, por ejemplo:
Camión – Ejes: 3 Peso total: 10000 – Peaje: 35€
Al pulsar el botón junto a la pantalla, se muestra los totales para esa cabina de peaje:
Totales desde la última recogida – Peaje: 79€ Camiones: 2
Cuando se realiza la recaudación se muestra el siguiente mensaje y se ponentodas las cantidades a cero:
**** Ejecutando recaudación ****
Totales desde la última recogida – Peaje: 550€ Camiones: 5
EJEMPLO POO PEAJE
8/16/2019 Teoria_ClasesJAVA
7/30
7
• Encontrar los objetos principales:
Podemos encontrar los objetos del problema buscando los nombressignificativos dentro de las frases que forman la definición del problema.
En nuestro caso son camiones, cabina, eje, peso y recibo.
De ellos, las cabinas y los camiones parecen ser los más importantes. Los ejes
y el peso son propiedades de un camión y los recibos son un elemento de lascabinas.
De esta forma tomamos los camiones y las cabinas como objetos principalesy diseñamos las clases relacionadas:
class Camion {
//definición de la clase}
class CabinaPeaje {
//definición de la clase
}
EJEMPLO POO PEAJE
8/16/2019 Teoria_ClasesJAVA
8/30
8
• Clase Camion:
1. Determinar el comportamiento deseado:
• El peaje depende del número de ejes y el peso del camión. Lascabinas necesitan estos datos de cada camión.
• Nuestra clase camión debería ofrecer métodos que nos dieranesta información.
• También tendrá un constructor que nos permitirá crearcamiones.
Métodos:• Camion (constructor)
• getEjes
• getPesoTotal
EJEMPLO POO PEAJE
8/16/2019 Teoria_ClasesJAVA
9/30
9
• Clase Camion:
2. Definición de la interfaz: • La interfaz de la clase camión la componen las signaturas de su conjunto de métodos.
Determina cómo otras clases se comunican con un objeto Camion.• Una buena forma de definir una interfaz es realizar un trozo de código que use un
objeto de la clase que se está diseñando. Por ejemplo:Camion camion1 = new Camion(3, 10000)
• Representaría un camión con 3 ejes y 10000 Kg. de peso.• Preguntar cuantos ejes y peso tiene un camión es fácil:
camion1.getEjes() camion1.getPesoTotal()
•
Por lo tanto podremos definir el interfaz de la clase como sigue:class Camion{
//Métodos
public Camion(int ejes, int pesoTotal) {...}
public int getEjes() {...}
public int getPesoTotal() {...}
//Atributos...
}
EJEMPLO POO PEAJE
8/16/2019 Teoria_ClasesJAVA
10/30
10
• Clase Camion:
3. Definir los atributos: • Los valores de los ejes y el peso deben ir asociado a cada
camión por lo tanto:class Camion
{
//Métodos
public Camion(int ejes, int pesoTotal) {...}
public int getEjes() {...}
public int getPesoTotal() {...}
//Atributos
private int ejes;
private int pesoTotal;
}
EJEMPLO POO PEAJE
8/16/2019 Teoria_ClasesJAVA
11/30
11
• Clase Camion:
4. Implementar los métodos:• Los métodos getEjes y getPesoTotal deben devolver los valores
de los atributos y el constructor asignárselos, por lo tanto:class Camion
{
//Atributos (privados)private int ejes;
private int pesoTotal;
//Métodos (públicos)
public Camion(int ejes, int pesoTotal) {
this.ejes=ejes;
this.pesoTotal=pesoTotal;
}
public int getEjes() {
return ejes;
}
public int getPesoTotal(){
return pesoTotal;
}}
EJEMPLO POO PEAJE
8/16/2019 Teoria_ClasesJAVA
12/30
12
• Clase CabinaPeaje:
1. Determinar el comportamiento deseado:
• El principal comportamiento deseado para la clase CabinaPeajees el cálculo del importe del peaje.
• También debe contar el total de recibos y de camiones que ha procesado. Y poner estos datos a cero cuando se haga larecaudación. Métodos:
– CabinaPeaje (constructor) – calculaPeaje
– muestraDatos
– recaudar
EJEMPLO POO PEAJE
8/16/2019 Teoria_ClasesJAVA
13/30
13
• Clase CabinaPeaje:
2. Definición de la interfaz:
• Para crear una nueva cabina deberemos utilizar el siguiente trozo de código:CabinaPeaje cab = new CabinaPeaje()
• Cada vez que se calcule un peaje:cab.calculaPeaje(camion1)
• Para mostrar los datos del total recaudado hasta el momento:cab.muestraDatos()
• Para realizar la recaudación:cab.recaudar()
• Ninguno de estos métodos retorna ningún valor, simplemente hacen cosas. Por lo tanto lainterfaz de la clase sería la siguiente:
class CabinaPeaje
{ //Métodos
public CabinaPeaje() {...}
public void calculaPeaje(Camion camion) {...}
public void recaudar() {...}
public void muestraDatos() {...}
//Atributos
...
}
EJEMPLO POO PEAJE
8/16/2019 Teoria_ClasesJAVA
14/30
14
• Clase CabinaPeaje:
3. Definir los atributos:
• La cabina debe mantener el importe total de todos los recibos de peajecobrados y el número de camiones desde la última recaudación.class CabinaPeaje
{//Métodos
public CabinaPeaje() {...}
public void calculaPeaje(Camion camion) {...}
public void recaudar() {...}
public void muestraDatos() {...}
//Atributos
private int total;
private int camiones;
}
EJEMPLO POO PEAJE
8/16/2019 Teoria_ClasesJAVA
15/30
15
• Clase CabinaPeaje:
class CabinaPeaje {//Atributos
private int total;
private int camiones;
//Métodos
public CabinaPeaje() {
total=0;
camiones=0;
}
public void muestraDatos() {
System.out.println("Totales desde la última recogida - Peaje: "+total
+"€ Camiones: "+camiones);
}
public void recaudar() {
System.out.println("**** Ejecutando recaudación ****");
muestraDatos();
total=0;
camiones=0;
}
public void calculaPeaje(Camion camion) {int ejes=camion.getEjes();
int pesoTotal=camion.getPesoTotal();
int peaje=5*ejes + 2*(pesoTotal/1000);
System.out.println("Camión - Ejes: "+ejes+" Peso total: "+pesoTotal
+" - Peaje: "+peaje+"€" );
camiones++;
total += peaje;
}
}
EJEMPLO POO PEAJE
8/16/2019 Teoria_ClasesJAVA
16/30
16
• La prueba de las clases:
public class PruebaCabinaPeaje
{
public static void main(String args[])
{
//Crea la cabina
CabinaPeaje cabina = new CabinaPeaje();//Crea camiones
Camion camion1 = new Camion(3, 10000);
Camion camion2 = new Camion(4, 12500);
//Cobra peajes
cabina.calculaPeaje(camion1);
cabina.muestraDatos();
cabina.calculaPeaje(camion2);
//Recauda
cabina.recaudar();
cabina.muestraDatos();
}
}
>java PruebaCabinaPeajeCamión - Ejes: 3 Peso total: 10000 - Peaje: 35 € Totales desde la última recogida - Peaje: 35 € Camiones: 1Camión - Ejes: 4 Peso total: 12500 - Peaje: 44 € **** Ejecutando recaudación ****Totales desde la última recogida - Peaje: 79 € Camiones: 2Totales desde la última recogida - Peaje: 0 € Camiones: 0
EJEMPLO POO PEAJE
8/16/2019 Teoria_ClasesJAVA
17/30
17
CLASES CON HERENCIA
• Definición del problema:
– El organismo encargado de las autopistas de un determinado país estáinstalando un sistema de cobro de peajes en una de sus carreteras másimportantes.
– Se debe cobrar peaje a dos tipos distintos de vehículos, los camiones y losautobuses de la siguiente forma:• Los camiones que llegan a una cabina de peaje deben pagar 5€ por eje y 2€ por
cada tonelada de peso y los autobuses deben pagar 1€ por pasajero y 5€ por cadatonelada de peso.
– Una pantalla en la cabina de peaje muestra la cantidad del total de reciboscobrados y la cantidad de vehículos que han pagado desde la últimarecaudación.
– Cada vez que se realice un peaje debe mostrar su importe así como la matrículadel vehículo y su peso para cualquier tipo de vehículo. Si se trata de un camióndebe mostrar además de esa información el número de ejes y si se trata de unautobús el número de pasajeros.
– También se quiere saber cuantos vehículos han pagado peaje en el total decabinas.
8/16/2019 Teoria_ClasesJAVA
18/30
18
CLASES CON HERENCIA
• Encontrar los objetos principales:
• Nombres significativos: vehículos, camiones,autobuses, cabina, matrícula, peso, eje, pasajeros yrecibo.
• De ellos, las cabinas, los vehículos, los camiones y losautobuses parecen ser los más importantes. Lo demásson propiedades de los objetos que definamos.
• De las clases principales nos damos cuenta que hay unarelación muy estrecha entre vehículos, camiones yautobuses, ya que comparten propiedades y métodoscomunes → mecanismo de la herencia.
8/16/2019 Teoria_ClasesJAVA
19/30
19
CLASES CON HERENCIA
• Encontrar los objetos principales:
• De esta forma tomamos los vehículos, los camiones, losautobuses y las cabinas como objetos principales y diseñamoslas clases relacionadas:
8/16/2019 Teoria_ClasesJAVA
20/30
20
CLASES CON HERENCIApublic class VehiculoH
{
//Atr ibutosprivate String matri cula;
private int pesoTotal;
//Cantidad de vehículos que han pasado por elpeaje
private static int cantidad=0;
//Métodos
public VehiculoH(Stri ng matricula,int pesoTotal) {
this.matricula=matricula;
this.pesoTotal=pesoTotal;
incrementaCantidad();
}
private static void incrementaCanti dad() {
cantidad++;
}
publi c String getMatricula() {
return this.matricula;
}
public in t getPesoTotal() {
retur n this.pesoTotal;
}
public static int getCantidad() {return VehiculoH .cantidad;
}
public static void borraCantidad() {
VehiculoH .cantidad = 0;
}
public Stri ng toStr ing() {return " Vehícul o con matrícula: “
+matri cula+" Peso total: " +pesoTotal;
}
}
8/16/2019 Teoria_ClasesJAVA
21/30
21
CLASES CON HERENCIAclass CamionH extends VehiculoH
{
//Atr ibutos
private int ejes;
//Métodos
public CamionH(String matri cula, in t pesoTotal, int ejes) {
super(matricula, pesoTotal);
this.ejes=ejes; }
publi c int getEjes() {
return ejes;
}
public Str ing toStr ing() {
Str ing s = super.toStr ing();
return s+" # Camión - Ejes: " +ejes;
} }
8/16/2019 Teoria_ClasesJAVA
22/30
22
CLASES CON HERENCIAclass AutobusH extends VehiculoH
{
//Atr ibutos
private int pasajeros;
//Métodos
publi c AutobusH(Str ing matri cula, int pesoTotal, int pasajeros) {
super(matr icula, pesoTotal);
this.pasajeros=pasajeros; }
publ ic int getPasajeros() {
return pasajeros;
}
public Str ing toStr ing() {
Str ing s = super.toStr ing();
return s+" # Autobús - Pasajeros: " +pasajeros;
} }
8/16/2019 Teoria_ClasesJAVA
23/30
23
CLASES CON HERENCIAclass CabinaPeajeH
{
//Atr ibutos //total recaudado
private in t total;
//cantidad de vehícul os que han pasado por esa cabina
private int vehiculos;
//Métodos
public CabinaPeajeH () {
total=0;vehiculos=0;
}
public void muestraDatos() {
System.out.pri nt ln (" Totales desde la última recogida - Peaje: " +total+" € Vehículos:" +vehiculos);
}
public void recaudar() {
System.out.pri ntln(" * * * * Ejecutando recaudación * * * * " );
muestraDatos();
total=0;
vehiculos=0;
}
8/16/2019 Teoria_ClasesJAVA
24/30
24
CLASES CON HERENCIA //sobrecarga de métodos
publi c void calculaPeaje(CamionH camion)
{int ejes=camion.getEj es();
int pesoTotal=camion.getPesoTotal();
int peaje=5* ejes + 2* (pesoTotal/1000);
System.out.println(camion.toStri ng()+" - Peaje: " +peaje+" € " );
vehiculos++;
total += peaje;
}
publi c void calculaPeaje(AutobusH bus){
int pasajeros=bus.getPasajeros();
int pesoTotal =bus.getPesoTotal ();
int peaje=1* pasajeros + 5* (pesoTotal/1000);
System.out.println(bus.toStr ing()+" - Peaje: " +peaje+" € " );vehiculos++;
total += peaje;
}
}
8/16/2019 Teoria_ClasesJAVA
25/30
25
CLASES CON HERENCIA
publi c class PruebaCabinaPeajeH
{
public static void main(Stri ng args[] ){
//Cr ea las cabinas
CabinaPeajeH cabina1 = new CabinaPeajeH() ;
CabinaPeajeH cabina2 = new CabinaPeajeH() ;
//Crea camiones
CamionH camion1 = new CamionH(" 1234-BCD" ,10000,3);
CamionH camion2 = new CamionH(" 2345-CDF" ,15500,4);
//Cr ea autobuses
AutobusH bus1 = new AutobusH(" 5678-CFG" ,7000,35);AutobusH bus2 = new AutobusH(" 6789-DTD" ,8000,50);
//Cobr a peajes
cabina1.calculaPeaje(camion1);
cabina1.calculaPeaje(bus1);
cabina1.muestraDatos();
cabina2.calculaPeaje(camion2);
cabina2.calculaPeaje(bus2);
cabina2.muestraDatos();
//Recaudacabina1.recaudar();
cabina1.muestraDatos();
cabina2.recaudar();
cabina2.muestraDatos();
System.out.pri nt ln(" Total vehículos de todas las cabinas: “
+VehiculoH.getCantidad());
VehiculoH.borraCantidad();
}
}
>java PruebaCabinaPeajeHVehículo con matrícula: 1234-BCD Peso total: 10000 # Camión -Ejes: 3 - Peaje: 35 € Vehículo con matrícula: 5678-CFG Peso total: 7000 # Autobús -Pasajeros: 35 - Peaje: 70 € Totales desde la última recogida - Peaje: 105 € Vehículos: 2Vehículo con matrícula: 2345-CDF Peso total: 15500 # Camión -Ejes: 4 - Peaje: 50 €
Vehículo con matrícula: 6789-DTD Peso total: 8000 # Autobús -Pasajeros: 50 - Peaje: 90 € Totales desde la última recogida - Peaje: 140 € Vehículos: 2**** Ejecutando recaudación ****Totales desde la última recogida - Peaje: 105 € Vehículos: 2Totales desde la última recogida - Peaje: 0 € Vehículos: 0**** Ejecutando recaudación ****Totales desde la última recogida - Peaje: 140 € Vehículos: 2Totales desde la última recogida - Peaje: 0 € Vehículos: 0Total vehículos de todas las cabinas: 4
CLASES ABSTRACTAS +
8/16/2019 Teoria_ClasesJAVA
26/30
26
CLASES ABSTRACTAS +HERENCIA + POLIMORFISMO
• Clases del problema: –
Para ver la utilidad de las clases abstractas y el polimorfismo vamos amodificar la jerarquía de clases desarrollada en el apartado anterior de formaque definamos la clase vehículo como una clase abstracta que contenga unmétodo peaje con la intención de calcular el peaje de los distintos tipos devehículos que pasen por las cabinas de peaje.
CLASES ABSTRACTAS +
8/16/2019 Teoria_ClasesJAVA
27/30
27
CLASES ABSTRACTAS +HERENCIA + POLIMORFISMO
public abstract class VehiculoA{
//Atributos
private String matricula; private int pesoTotal;//Cantidad de vehículos que han pasado por el peaje
private static int cantidad=0;//Métodos
public VehiculoA(String matricula, int pesoTotal) {this.matricula=matricula;this.pesoTotal=pesoTotal;incrementaCantidad();
}
private static void incrementaCantidad() {cantidad++;}
public String getMatricula() {return this.matricula;
} public int getPesoTotal() {
return this.pesoTotal;}
public static int getCantidad() {return VehiculoA.cantidad;
} public static void borraCantidad() {
VehiculoA.cantidad = 0;}
public String toString() {return "Vehículo con matrícula: "+matricula
+" Peso total: “ + pesoTotal;}public abstract int peaje();
}
class CamionA extends VehiculoA { private int ejes;
public CamionA(String matricula, int pesoTotal, int ejes) {super(matricula, pesoTotal);this.ejes=ejes;
} public int getEjes() { return ejes; } public String toString() {
String s = super.toString();return s+" # Camión - Ejes: "+ejes;
}public int peaje() {
return 5*ejes + 2*(super.getPesoTotal()/1000);} }
class AutobusA extends VehiculoA { private int pasajeros; public AutobusA(String matricula, int pesoTotal, int pasajeros) {
super(matricula, pesoTotal);this.pasajeros=pasajeros;
} public int getPasajeros() { return pasajeros; }
public String toString() {String s = super.toString();return s+" # Autobús - Pasajeros: "+pasajeros;
}public int peaje() {
return 1*pasajeros + 5*(super.getPesoTotal()/1000);}
}
CLASES ABSTRACTAS +
8/16/2019 Teoria_ClasesJAVA
28/30
28
CLASES ABSTRACTAS +HERENCIA + POLIMORFISMO
class CabinaPeajeA{
//Atributos
//total recaudado private int total;//cantidad de vehículos que han pasado por esa cabina
private int vehiculos;//Métodos
public CabinaPeajeA() {total=0;vehiculos=0;
} public void muestraDatos() {
System.out.println("Totales desde la última recogida - Peaje: "+total+" € Vehículos: "+vehiculos); }
public void recaudar() {System.out.println("**** Ejecutando recaudación ****");muestraDatos();total=0;vehiculos=0;
}public void calculaPeaje(VehiculoA va) {
int peaje = va.peaje();System.out.println(va.toString()+" - Peaje: "+peaje+" €" );vehiculos++;total += peaje;
} }
CLASES ABSTRACTAS +
8/16/2019 Teoria_ClasesJAVA
29/30
29
CLASES ABSTRACTAS +HERENCIA + POLIMORFISMO
La prueba de las clases:
public class PruebaCabinaPeajeA
{ public static void main(String args[]){//Crea las cabinasCabinaPeajeA cabina1 = new CabinaPeajeA();CabinaPeajeA cabina2 = new CabinaPeajeA();//Crea distintos vehículosVehiculoA v1 = new CamionA("1234-BCD",10000,3);VehiculoA v2 = new CamionA("2345-CDF",15500,4);
VehiculoA v3 = new AutobusA("5678-CFG",7000,35);VehiculoA v4 = new AutobusA("6789-DTD",8000,50);
//Cobra peajescabina1.calculaPeaje(v1);cabina1.calculaPeaje(v3);cabina1.muestraDatos();cabina2.calculaPeaje(v2);cabina2.calculaPeaje(v4);cabina2.muestraDatos();//Recaudacabina1.recaudar();cabina1.muestraDatos();cabina2.recaudar();cabina2.muestraDatos();System.out.println("Total vehículos de todas las cabinas: "+VehiculoA.getCantidad());VehiculoA.borraCantidad();
}}
>java.exe PruebaCabinaPeajeAVehículo con matrícula: 1234-BCD Peso total: 10000 # Camión - Ejes: 3 -Peaje: 35 € Vehículo con matrícula: 5678-CFG Peso total: 7000 # Autobús - Pasajeros:35 - Peaje: 70 € Totales desde la última recogida - Peaje: 105 € Vehículos: 2Vehículo con matrícula: 2345-CDF Peso total: 15500 # Camión - Ejes: 4 -Peaje: 50 € Vehículo con matrícula: 6789-DTD Peso total: 8000 # Autobús - Pasajeros:
50 - Peaje: 90 €
Totales desde la última recogida - Peaje: 140 € Vehículos: 2**** Ejecutando recaudación ****Totales desde la última recogida - Peaje: 105 € Vehículos: 2Totales desde la última recogida - Peaje: 0 € Vehículos: 0**** Ejecutando recaudación ****Totales desde la última recogida - Peaje: 140 € Vehículos: 2Totales desde la última recogida - Peaje: 0 € Vehículos: 0Total vehículos de todas las cabinas: 4
CLASES ABSTRACTAS +
8/16/2019 Teoria_ClasesJAVA
30/30
30
CLASES ABSTRACTAS +HERENCIA + POLIMORFISMO
• Tipos de objetos almacenados en estr ucturas de datos dinámicas : – Para averiguar con que clase se instanciaron los objetos de una estructura de datos
dinámica utilizamos los siguientes métodos: Object obj;
Str ing ti po = obj.getClass().getName();
import java.util.*;
public class TipoVehiculo
{
public static void main(String args[]){
//Crea una cabina
CabinaPeajeA cabina = new CabinaPeajeA();
//Crea distintos vehículos
VehiculoA v1 = new CamionA("1234-BCD",10000,3);
VehiculoA v2 = new CamionA("2345-CDF",15500,4);
VehiculoA v3 = new AutobusA("5678-CFG",7000,35);
VehiculoA v4 = new AutobusA("6789-DTD",8000,50);
//Introducimos los vehículos en una hashtable
Hashtable vehiculos= new Hashtable();
vehiculos.put(v1.getMatricula(),v1);
vehiculos.put(v2.getMatricula(),v2);
vehiculos.put(v3.getMatricula(),v3);vehiculos put(v4 getMatricula() v4);
//Calculamos el peaje de todos los vehículos de la hashtable
for (Enumeration e = vehiculos.elements(); e.hasMoreElements();)
{
VehiculoA vaux = (VehiculoA) e.nextElement();
cabina.calculaPeaje(vaux);
//Sacamos el tipo para poder aplicarle sus métodos
String tipo = vaux.getClass().getName();
System.out.println("Tipo: "+tipo);
if (tipo.equals("CamionA"))
{
CamionA camion = (CamionA) vaux;
System.out.println("Ejes: "+camion.getEjes());
} else
{
AutobusA bus = (AutobusA) vaux;
System.out.println("Pasajeros: "+bus.getPasajeros());
}
}
}
}