Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porYolanda Miguélez Villalba Modificado hace 7 años
1
Diseño y Programación Orientada a Objetos
Conferencia # 11 Caso de estudio Integrador: Acueducto TEMA # 3: Herencia y Polimorfismo Facultad Ing. Informática ISPJAE
2
Contenidos que se integran
Encapsulamiento Herencia Polimorfismo Clases genéricas
3
En el Acueducto de Albear se desea automatizar el control de los tanques de agua que abastecen del preciado líquido a la Capital. Para almacenar agua existen un conjunto de tanques, que pueden tener forma cilíndrica o de cubo con base rectangular. De cada tanque se conoce: identificación, dimensiones y el volumen de agua almacenado.
4
Cada tanque tiene un conjunto de válvulas y cada una de ellas alimenta a un municipio. Las válvulas se cierran o abren en dependencia de las necesidades de abastecimiento del municipio y se guarda la fecha en que se realiza esta acción.
5
1.Diseñe las clases necesarias para modelar la situación anterior usando UML.
2. Implemente las clases modeladas en Java. 3. Implemente las funciones necesarias para satisfacer los siguientes requerimientos funcionales :
6
Requerimientos funcionales
Conocer la cantidad de m3 disponibles actualmente para la región. Abrir las válvulas que alimentan a un municipio si los tanques donde ellas se encuentran están por encima de un % dado de su capacidad. Conocer por municipios la cantidad de válvulas de tanques cilíndricos que están vertiendo
7
Requerimientos funcionales
Cerrar las válvulas de un tanque si el municipio que alimentan recibe agua de otros tanques, y si el tanque se encuentra por debajo del 25% de su capacidad. Conocer los municipios que están siendo abastecidos. Conocer el tanque que lleva más tiempo vertiendo hacia un municipio dado.
8
Diseño de clases
9
Tank CilindricalTank - float radius +float baseArea() CubeTank
String id float height float actualVolume +float baseArea() +float Volume() CilindricalTank - float radius +float baseArea() CubeTank float sideA float sideB +float baseArea()
10
Acueduct Municipality Valve Tank String name int population Date date
String id float height float actualVolume + float baseArea() +float Volume() Acueduct 0..* 1 1 1 0..* abastece 0..* Municipality String name int population Valve Date date boolean isOpen municiplaity 0..* 1 alimenta
11
Implementación en Java
12
public abstract class Tank {
private String ID; protected float height; private ArrayList <Valve> valves; protected float actualVolumen; public Tank (String id, float height, float actualVolumen) { ID = id; this.height = height; this.actualVolumen = actualVolumen; this.valves = new ArrayList<Valve>(); } …
13
public abstract class Tank { … public float volume() {
return baseArea()*height; } public abstract float baseArea(); public void addValve(Municipality municipality, Date date){ Valve v= new Valve(municipality,date); valves.add(v); } …
14
public class CilindricalTank extends Tank { private float radius;
public CilindricalTank(String id, float height, float actualVolumen, float radius) { super(id, height, actualVolumen); this.radius = radius; } public float baseArea() { return Math.PI * Math.pow(this.radius, 2);
15
public class CubeTank extends Tank {
private float sideA; private float sideB; public CubeTank(String id, float height, float actualVolumen, float sideA, float sideB) { super(id, height, actualVolumen); this.sideA = sideA; this.sideB = sideB; }
16
public class CubeTank extends Tank {
… public float baseArea() { return sideA*sideB; }
17
public class Valve { private Municipality municipality; private boolean isOpen; private Date date; public Valve(Municipality municipality, Date date) { this.municipality = municipality; this.date = date; this.isOpen = false; }
18
public class TankCollection { private ArrayList<Tank> tanks;
public TankCollection() { this.tanks = new ArrayList<Tank>(); } public boolean addTank(Tank tank) { if (find(tank.getID()) == -1) { tanks.add(tank); return true; } else return false; }
19
public class TankCollection {
… public boolean addValveTank(String id, Municipality municipality, Date date){ int p= find(id); if (p != -1) { tanks.get(p).addValve(municipality, date); return true; } else return false;
20
public class Municipality { private String name; private int population; public Municipality(String name, int population) { this.name = name; this.population = population; } // métodos set y get
21
public class MunicipalityCollection { private ArrayList<Municipality> municipalities; public MunicipalityCollection() { this.municipalities = new ArrayList<Municipality>(); } public Municipality find(String name) { …} public boolean addMunicipality(Municipality municipality) { … } public boolean delete(String name) {…}
22
public class Acueduct { private TankCollection tankColl; private MunicipalityCollection munColl; public Acueduct() { this.tankColl= new TankCollection(); this.munColl= new MunicipalityCollection(); }
23
public class Acueduct { …
public boolean addCilindricalTank(String id, float height, float actualVolumen, float radius){ CilindricalTank tank = new CilindricalTank(id, height, actualVolumen, radius)); return tankColl.addTank(tank} }
24
public class Acueduct { public boolean addCubeTank(String id,
… public boolean addCubeTank(String id, float height, float actualVolumen, float sideA, float sideB) { return tankCollection.addTank(new CubeTank(id, height, actualVolumen, sideA, sideB)); }
25
public boolean addValveTank(String id, Municipality municipality) {
public class Acueduct { … public boolean addValveTank(String id, Municipality municipality) { return tankCollection.addValveTank(id, municipality); }
26
Solución de los incisos utilizando Patrón Experto.
a. Conocer la cantidad de m3 disponibles actualmente para la región. Clases involucradas: - Tank : devolver el volumen actual - TankCollection : devolver la capacidad total (sumando el volumen actual de todos los tanques) - Acueduct: devolver la capacidad total invocando a la instancia de TankCollection.
27
Acueduct: invoca al método correspondiente a través de la instancia
b. Abrir las válvulas que alimentan a un municipio si los tanques donde ellas se encuentran están por encima de un % dado de su capacidad. Clases involucradas: - Tank: verifica si su volumen actual está por encima del % dado y abre las válvulas que abastecen al municipio. TankCollection: manda a ejecutar la acción anterior para todos los tanques. Acueduct: invoca al método correspondiente a través de la instancia
28
Estudio Independiente
- Implementar los incisos restantes.
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.