Sunteți pe pagina 1din 30

PROGRAMACIN

ORIENTADA A OBJETOS
CON JAVA

CAPTULO 5:

POO
EN JAVA
1

CONTENIDOS
TEMA 5: POO en Java.
1.
2.
3.
4.

DISEO DE CLASES
EJEMPLO POO PEAJE
CLASES CON HERENCIA
CLASES ABSTRACTAS + HERENCIA + POLIMORFISMO

DISEO DE CLASES
1.

2.

3.

4.

5.
6.

Descripcin del problema. Nos describe el sistema que debemos modelar.


Es imposible ofrecer una solucin satisfactoria sin un total conocimiento del
problema.
Encontrar los objetos principales. Buscar los elementos ms importantes
del modelo. Recomendacin: hacer una lista de todos los nombres que
aparecen en la descripcin del problema y elegir aquellos que nos parezcan
ms importantes.
Determinar el comportamiento deseado para cada uno de los objetos
principales. Este paso producir el conjunto de mtodos necesarios en las
clases a las que esos objetos pertenecen. Si necesitamos varias clases, las
trataremos una a una.
Determinar la interfaz. Estableceremos el prototipo de cada mtodo: sus
argumentos y tipo de retorno. Recomendacin: escribir un cdigo de ejemplo
que utilice el objeto y que muestre cmo deberan ocurrir las invocaciones de
una forma natural.
Definir los atributos e implementar los mtodos. A menudo concluiremos
con una justificacin de la solucin propuesta.
Determinar las relaciones con otras clases.

DISEO DE CLASES
Identificacin de
clases y objetos

Especificacin de
interfaces e
implementacin de
clases y objetos

Identificacin de
las semnticas de
clases y objetos

Identificacin de
las relaciones de
clases y objetos
4

EJEMPLO POO PEAJE


Definicin del problema:
El organismo encargado de las autopistas de un
determinado pas est instalando un sistema de
cobro de peajes en una de sus carreteras ms
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 la
cantidad del total de recibos cobrados y la cantidad
de camiones que han pagado desde la ltima
recaudacin.
5

EJEMPLO POO PEAJE


Un escenario de ejemplo:

Para ayudar a disear el sistema, imaginemos como funcionara un sistema de


cobro de peaje de esta naturaleza:
Un agente de peajes espera en la cabina con una pantalla y un lector de
cdigos de barras. Cuando llega un camin, el agente lee el cdigo de barras
del camin con sus datos.
La informacin del camin y el importe del peaje se muestra en la pantalla
del ordenador, por ejemplo:
Camin Ejes: 3 Peso total: 10000 Peaje: 35

Al pulsar el botn 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 recaudacin se muestra el siguiente mensaje y se ponen


todas las cantidades a cero:
**** Ejecutando recaudacin ****
Totales desde la ltima recogida Peaje: 550 Camiones: 5
6

EJEMPLO POO PEAJE


Encontrar los objetos principales:

Podemos encontrar los objetos del problema buscando los nombres


significativos dentro de las frases que forman la definicin del problema.
En nuestro caso son camiones, cabina, eje, peso y recibo.
De ellos, las cabinas y los camiones parecen ser los ms importantes. Los ejes
y el peso son propiedades de un camin y los recibos son un elemento de las
cabinas.
De esta forma tomamos los camiones y las cabinas como objetos principales
y diseamos las clases relacionadas:
class Camion {
//definicin de la clase
}
class CabinaPeaje {
//definicin de la clase
}
7

EJEMPLO POO PEAJE


Clase Camion:
1. Determinar el comportamiento deseado:
El peaje depende del nmero de ejes y el peso del camin. Las
cabinas necesitan estos datos de cada camin.
Nuestra clase camin debera ofrecer mtodos que nos dieran
esta informacin.
Tambin tendr un constructor que nos permitir crear
camiones.
Mtodos:

Camion (constructor)
getEjes
getPesoTotal

EJEMPLO POO PEAJE


Clase Camion:
2.

Definicin de la interfaz:

La interfaz de la clase camin la componen las signaturas de su conjunto de mtodos.


Determina cmo otras clases se comunican con un objeto Camion.
Una buena forma de definir una interfaz es realizar un trozo de cdigo que use un
objeto de la clase que se est diseando. Por ejemplo:

Camion camion1 = new Camion(3, 10000)

Representara un camin con 3 ejes y 10000 Kg. de peso.


Preguntar cuantos ejes y peso tiene un camin es fcil:
camion1.getEjes()

camion1.getPesoTotal()

Por lo tanto podremos definir el interfaz de la clase como sigue:


class Camion
{
//Mtodos
public Camion(int ejes, int pesoTotal) {...}
public int getEjes() {...}
public int getPesoTotal() {...}
//Atributos...
}

EJEMPLO POO PEAJE


Clase Camion:
3. Definir los atributos:
Los valores de los ejes y el peso deben ir asociado a cada
camin por lo tanto:
class Camion
{
//Mtodos
public Camion(int ejes, int pesoTotal) {...}
public int getEjes() {...}
public int getPesoTotal() {...}
//Atributos
private int ejes;
private int pesoTotal;
}
10

EJEMPLO POO PEAJE


Clase Camion:
4. Implementar los mtodos:
Los mtodos getEjes y getPesoTotal deben devolver los valores
de los atributos y el constructor asignrselos, por lo tanto:
class Camion
{
//Atributos (privados)
private int ejes;
private int pesoTotal;
//Mtodos (pblicos)
public Camion(int ejes, int pesoTotal) {
this.ejes=ejes;
this.pesoTotal=pesoTotal;
}
public int getEjes() {
return ejes;
}
public int getPesoTotal(){
return pesoTotal;
}
}

11

EJEMPLO POO PEAJE


Clase CabinaPeaje:
1. Determinar el comportamiento deseado:
El principal comportamiento deseado para la clase CabinaPeaje
es el clculo del importe del peaje.
Tambin debe contar el total de recibos y de camiones que ha
procesado. Y poner estos datos a cero cuando se haga la
recaudacin.

Mtodos:
CabinaPeaje (constructor)
calculaPeaje
muestraDatos
recaudar
12

EJEMPLO POO PEAJE


Clase CabinaPeaje:
2. Definicin de la interfaz:

Para crear una nueva cabina deberemos utilizar el siguiente trozo de cdigo:
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 recaudacin:


cab.recaudar()

Ninguno de estos mtodos retorna ningn valor, simplemente hacen cosas. Por lo tanto la
interfaz de la clase sera la siguiente:
class CabinaPeaje
{
//Mtodos
public CabinaPeaje() {...}
public void calculaPeaje(Camion camion) {...}
public void recaudar() {...}
public void muestraDatos() {...}
//Atributos
...
}

13

EJEMPLO POO PEAJE


Clase CabinaPeaje:
3.

Definir los atributos:


La cabina debe mantener el importe total de todos los recibos de peaje
cobrados y el nmero de camiones desde la ltima recaudacin.
class CabinaPeaje
{
//Mtodos
public CabinaPeaje() {...}
public void calculaPeaje(Camion camion) {...}
public void recaudar() {...}
public void muestraDatos() {...}
//Atributos
private int total;
private int camiones;
}
14

EJEMPLO POO PEAJE


Clase CabinaPeaje:
class CabinaPeaje {
//Atributos
private int total;
private int camiones;
//Mtodos
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 recaudacin ****");
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("Camin - Ejes: "+ejes+" Peso total: "+pesoTotal
+" - Peaje: "+peaje+"" );
camiones++;
total += peaje;
}
}

15

EJEMPLO POO PEAJE


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();
>java PruebaCabinaPeaje
cabina.calculaPeaje(camion2);
Camin - Ejes: 3 Peso total: 10000 - Peaje: 35
//Recauda
Totales desde la ltima recogida - Peaje: 35 Camiones: 1
Camin - Ejes: 4 Peso total: 12500 - Peaje: 44
cabina.recaudar();
**** Ejecutando recaudacin ****
cabina.muestraDatos();
Totales desde la ltima recogida - Peaje: 79 Camiones: 2
Totales desde la ltima recogida - Peaje: 0 Camiones: 0
}
}

16

CLASES CON HERENCIA

Definicin del problema:

El organismo encargado de las autopistas de un determinado pas est


instalando un sistema de cobro de peajes en una de sus carreteras ms
importantes.
Se debe cobrar peaje a dos tipos distintos de vehculos, los camiones y los
autobuses 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 cada
tonelada de peso.

Una pantalla en la cabina de peaje muestra la cantidad del total de recibos


cobrados y la cantidad de vehculos que han pagado desde la ltima
recaudacin.
Cada vez que se realice un peaje debe mostrar su importe as como la matrcula
del vehculo y su peso para cualquier tipo de vehculo. Si se trata de un camin
debe mostrar adems de esa informacin el nmero de ejes y si se trata de un
autobs el nmero de pasajeros.
Tambin se quiere saber cuantos vehculos han pagado peaje en el total de
cabinas.
17

CLASES CON HERENCIA


Encontrar los objetos principales:
Nombres
significativos:
vehculos,
camiones,
autobuses, cabina, matrcula, peso, eje, pasajeros y
recibo.
De ellos, las cabinas, los vehculos, los camiones y los
autobuses parecen ser los ms importantes. Lo dems
son propiedades de los objetos que definamos.
De las clases principales nos damos cuenta que hay una
relacin muy estrecha entre vehculos, camiones y
autobuses, ya que comparten propiedades y mtodos
comunes mecanismo de la herencia.
18

CLASES CON HERENCIA

Encontrar los objetos principales:


De esta forma tomamos los vehculos, los camiones, los
autobuses y las cabinas como objetos principales y diseamos
las clases relacionadas:

19

CLASES CON HERENCIA


public class VehiculoH
{
//Atributos
private String matricula;
private int pesoTotal;
//Cantidad de vehculos que han pasado por el
peaje
private static int cantidad=0;
//Mtodos
public VehiculoH(String matricula,
int pesoTotal) {
this.matricula=matricula;
this.pesoTotal=pesoTotal;
incrementaCantidad();
}

public String getMatricula() {


return this.matricula;
}
public int getPesoTotal() {
return this.pesoTotal;
}
public static int getCantidad() {
return VehiculoH.cantidad;
}
public static void borraCantidad() {
VehiculoH.cantidad = 0;
}

public String toString() {


return "Vehculo con matrcula:
+matricula+" Peso total: "+pesoTotal;
}

private static void incrementaCantidad() {


cantidad++;
}
}

20

CLASES CON HERENCIA


class CamionH extends VehiculoH
{
//Atributos
private int ejes;
//Mtodos
public CamionH(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+" # Camin - Ejes: "+ejes;
}
}

21

CLASES CON HERENCIA


class AutobusH extends VehiculoH
{
//Atributos
private int pasajeros;
//Mtodos
public AutobusH(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+" # Autobs - Pasajeros: "+pasajeros;
}
}

22

CLASES CON HERENCIA


class CabinaPeajeH
{
//Atributos
//total recaudado
private int total;
//cantidad de vehculos que han pasado por esa cabina
private int vehiculos;
//Mtodos
public CabinaPeajeH() {
total=0;
vehiculos=0;
}
public void muestraDatos() {
System.out.println("Totales desde la ltima recogida - Peaje: "+total+" Vehculos:
"+vehiculos);
}
public void recaudar() {
System.out.println("**** Ejecutando recaudacin ****");
muestraDatos();
total=0;
vehiculos=0;
}
23

CLASES CON HERENCIA


//sobrecarga de mtodos

public void calculaPeaje(CamionH camion)


{
int ejes=camion.getEjes();
int pesoTotal=camion.getPesoTotal();
int peaje=5*ejes + 2*(pesoTotal/1000);
System.out.println(camion.toString()+" - Peaje: "+peaje+"" );
vehiculos++;
total += peaje;
}

public void calculaPeaje(AutobusH bus)


{
int pasajeros=bus.getPasajeros();
int pesoTotal=bus.getPesoTotal();
int peaje=1*pasajeros + 5*(pesoTotal/1000);
System.out.println(bus.toString()+" - Peaje: "+peaje+"" );
vehiculos++;
total += peaje;
}
}
24

CLASES CON HERENCIA


public class PruebaCabinaPeajeH
{
public static void main(String args[])
{
//Crea las cabinas
>java PruebaCabinaPeajeH
CabinaPeajeH cabina1 = new CabinaPeajeH();
Vehculo con matrcula: 1234-BCD Peso total: 10000 # Camin CabinaPeajeH cabina2 = new CabinaPeajeH();
Ejes: 3 - Peaje: 35
Vehculo con matrcula: 5678-CFG Peso total: 7000 # Autobs //Crea camiones
Pasajeros: 35 - Peaje: 70
CamionH camion1 = new CamionH("1234-BCD",10000,3);
Totales desde la ltima recogida - Peaje: 105 Vehculos: 2
CamionH camion2 = new CamionH("2345-CDF",15500,4);
Vehculo con matrcula: 2345-CDF Peso total: 15500 # Camin //Crea autobuses
Ejes: 4 - Peaje: 50
AutobusH bus1 = new AutobusH("5678-CFG",7000,35);
Vehculo con matrcula: 6789-DTD Peso total: 8000 # Autobs Pasajeros: 50 - Peaje: 90
AutobusH bus2 = new AutobusH("6789-DTD",8000,50);
Totales desde la ltima recogida - Peaje: 140 Vehculos: 2
//Cobra peajes
**** Ejecutando recaudacin ****
cabina1.calculaPeaje(camion1);
Totales desde la ltima recogida - Peaje: 105 Vehculos: 2
cabina1.calculaPeaje(bus1);
Totales desde la ltima recogida - Peaje: 0 Vehculos: 0
cabina1.muestraDatos();
**** Ejecutando recaudacin ****
Totales desde la ltima recogida - Peaje: 140 Vehculos: 2
cabina2.calculaPeaje(camion2);
Totales desde la ltima recogida - Peaje: 0 Vehculos: 0
cabina2.calculaPeaje(bus2);
Total vehculos de todas las cabinas: 4
cabina2.muestraDatos();
//Recauda
cabina1.recaudar();
cabina1.muestraDatos();
cabina2.recaudar();
cabina2.muestraDatos();
System.out.println("Total vehculos de todas las cabinas:
+VehiculoH.getCantidad());
VehiculoH.borraCantidad();
}
}
25

CLASES ABSTRACTAS +
HERENCIA + POLIMORFISMO

Clases del problema:

Para ver la utilidad de las clases abstractas y el polimorfismo vamos a


modificar la jerarqua de clases desarrollada en el apartado anterior de forma
que definamos la clase vehculo como una clase abstracta que contenga un
mtodo peaje con la intencin de calcular el peaje de los distintos tipos de
vehculos que pasen por las cabinas de peaje.

26

CLASES ABSTRACTAS +
HERENCIA + POLIMORFISMO
public abstract class VehiculoA
{
//Atributos
private String matricula;
private int pesoTotal;
//Cantidad de vehculos que han pasado por el peaje
private static int cantidad=0;
//Mtodos
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 "Vehculo con matrcula: "+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+" # Camin - 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+" # Autobs - Pasajeros: "+pasajeros;
}
public int peaje() {
return 1*pasajeros + 5*(super.getPesoTotal()/1000);
}
}

27

CLASES ABSTRACTAS +
HERENCIA + POLIMORFISMO
class CabinaPeajeA
{
//Atributos
//total recaudado
private int total;
//cantidad de vehculos que han pasado por esa cabina
private int vehiculos;
//Mtodos
public CabinaPeajeA() {
total=0;
vehiculos=0;
}
public void muestraDatos() {
System.out.println("Totales desde la ltima recogida - Peaje: "+total+" Vehculos: "+vehiculos);
}
public void recaudar() {
System.out.println("**** Ejecutando recaudacin ****");
muestraDatos();
total=0;
vehiculos=0;
}
public void calculaPeaje(VehiculoA va) {
int peaje = va.peaje();
System.out.println(va.toString()+" - Peaje: "+peaje+"" );
vehiculos++;
total += peaje;
}

28

CLASES ABSTRACTAS +
HERENCIA + POLIMORFISMO
La prueba de las clases:
public class PruebaCabinaPeajeA
{
public static void main(String args[])
{
//Crea las cabinas
CabinaPeajeA cabina1 = new CabinaPeajeA();
CabinaPeajeA cabina2 = new CabinaPeajeA();
//Crea distintos vehculos
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);

>java.exe PruebaCabinaPeajeA
Vehculo con matrcula: 1234-BCD Peso total: 10000 # Camin - Ejes: 3 Peaje: 35
Vehculo con matrcula: 5678-CFG Peso total: 7000 # Autobs - Pasajeros:
35 - Peaje: 70
Totales desde la ltima recogida - Peaje: 105 Vehculos: 2
Vehculo con matrcula: 2345-CDF Peso total: 15500 # Camin - Ejes: 4 Peaje: 50
Vehculo con matrcula: 6789-DTD Peso total: 8000 # Autobs - Pasajeros:
50 - Peaje: 90
Totales desde la ltima recogida - Peaje: 140 Vehculos: 2
**** Ejecutando recaudacin ****
Totales desde la ltima recogida - Peaje: 105 Vehculos: 2
Totales desde la ltima recogida - Peaje: 0 Vehculos: 0
**** Ejecutando recaudacin ****
Totales desde la ltima recogida - Peaje: 140 Vehculos: 2
Totales desde la ltima recogida - Peaje: 0 Vehculos: 0
Total vehculos de todas las cabinas: 4

//Cobra peajes
cabina1.calculaPeaje(v1);
cabina1.calculaPeaje(v3);
cabina1.muestraDatos();
cabina2.calculaPeaje(v2);
cabina2.calculaPeaje(v4);
cabina2.muestraDatos();
//Recauda
cabina1.recaudar();
cabina1.muestraDatos();
cabina2.recaudar();
cabina2.muestraDatos();
System.out.println("Total vehculos de todas las cabinas: "+VehiculoA.getCantidad());
VehiculoA.borraCantidad();
}
}

29

CLASES ABSTRACTAS +
HERENCIA + POLIMORFISMO

Tipos de objetos almacenados en estructuras de datos dinmicas :

Para averiguar con que clase se instanciaron los objetos de una estructura de datos
dinmica utilizamos los siguientes mtodos:
Object obj;
String tipo = obj.getClass().getName();

import java.util.*;
public class TipoVehiculo
{
public static void main(String args[])
{
//Crea una cabina
CabinaPeajeA cabina = new CabinaPeajeA();
//Crea distintos vehculos
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 vehculos 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 vehculos 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 mtodos
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());
}
}

}
}

30

S-ar putea să vă placă și