UPC – EPE - POO
Prof. Estanislao Contreras
INGENIERÍA DE SISTEMAS - EPE PROGRAMACIÓN ORIENTADA A OBJETOS Herencia y Polimorfismo Ejercicio Propuesto Profesor
:
Estanislao Contreras
Objetivos
Diseñar las interfaces de usuario acorde a los requerimientos del problema. Identificar escenarios de herencia y polimorfismo Ordenar jerarquías mediante el proceso de Generalización-Especializació Generalización-Especialización n Elaborar el diagrama de clases y sus relaciones relaciones usando NetBeans. Implementación de la aplicación en Java usando NetBeans
Caso Trans-i BPM 1.0 Trans-i Technologies Inc, es una consultora internacional especializada en Desarrollo de Sistemas y que ahora intenta ingresar al sector de capacitación y entrenamiento en temas de Tecnologías de Información. Trans-i planea impartir, de forma gratuita, la primera versión de su curso de Business Process Management (BPM 1.0). Los interesados en llevar el curso y obtener el certificado correspondiente deberán inscribirse escogiendo el sistema de calificación que más se ajuste a sus necesidades y preferencias. BPM 1.0 tiene 2 modalidades de calificación: calificación:
Tradicional y Práctica .
La modalidad Tradicional , esta orientada a profesionales que sólo requieren conocer los conceptos de BPM. Bajo esta modalidad la calificación es como sigue:
Promedio Final = 0.30 EP + 0.30 EF + 0.20 PC1 + 0.20 PC2 En donde: EP EF PC1 PC2
Examen Parcial Examen Final Práctica Calificada 1 Práctica Calificada 2
La modalidad Práctica, esta orientada a profesionales que desean implementar de los conceptos de BPM bajo la tutoría de Trans-i. Bajo esta modalidad la calificación calificación es como sigue:
Promedio Final = 0.15 EP + 0.25 EF +0.10 TB1 + 0.10 TB2 + 0.40 PF En donde: EP EF TB1 TB2 PF
Examen Parcial Examen Final Trabajo 1 - Primer avance del proyecto final Trabajo 2 – Segundo avance del proyecto final Proyecto Final
Se desea desarrollar una aplicación que le permita controlar las calificaciones de los alumnos al umnos que ingresarán ingresarán al curso cu rso de BPM 1.0. La aplicación debe satisfacer los siguientes requerimientos: Registrar los datos de los alumnos (Código, Nombre y Modalidad de calificación)
Herencia y Polimorfismo
Página 1 de 14
UPC – EPE - POO
Prof. Estanislao Contreras
Registrar las calificaciones por alumno Calcular y mostrar la nota por al umno. Mostrar estadísticas generales.
Considere las siguientes interfaces de usuario:
Solución En resumen, la secuencia de pasos para solucionar el caso es la siguiente: 1. Generación del proyecto Java y diseños de las interfases de usuario 2. Generación del proyecto UML e ingeniería reversa al proyecto Java
Herencia y Polimorfismo
Página 2 de 14
UPC – EPE - POO 3. 4. 5. 6.
Prof. Estanislao Contreras
Creación de los diagramas de clase en el proyecto UML Generación de las clases Java a partir del diagrama de clases planteado Implementación de métodos y eventos. Actualización de los modelos UML mediante ingeniería reversa al proyecto Java
Paso 1: Generación del proyecto Java y diseño de las interfaces de usuario 1.1 Creación del proyecto Java Crear un proyecto del tipo Java Application considerando como nombre TransiBPM 1.2 Diseño de las interfases de usuario. Crear y diseñar las tres interfases de usuarios sugeridas considerando: Nombre VistaAlumnos
Tipo Júrame
VistaCalificacionPractica
JDialog
VistcaCalificacionTradicional
JDialog
Observaciones Interfase de usuario principal de la aplicación, en donde se mantendrá actualizado el registro de Alumnos Interfase de usuario en donde se mantendrá actualizado las calificaciones de la modalidad Práctica. Será una ventana detalle Interfase de usuario en donde se mantendrá actualizado las calificaciones de la modalidad Tradicional. Será una ventana detalle
Asegurarse de crear dichas interfases dentro del paquete transibpm A estas alturas, se debe tener 4 clases en el proyecto Java, nótese que cada uno de ellos tienen su propio método main(). Puesto que se necesita sólo un metodo main() para la aplicación, se procederá como sigue: main() de la clase VistaCalificacionPractica
Acción Eliminarlo
VistaCalificacionTradicional
Eliminarlo
Main
Sustituir el contenido por el método main() de VistaAlumnos Eliminarlo
VistaAlumnos
Observaciones Se elimina por qué esta ventana no puede representar al programa principal. Se elimina por qué esta ventana no puede representar al programa principal. Main representa al programa principal. El método copiado creará una ventana de VistaAlumnos como parte de su ejecución. Se elimina por qué esta ventana no puede representar al programa principal.
Diseñe las interfases de usuario considerando los requerimientos de la aplicación, asegurarse de asignar nombres adecuados a los elementos visuales relevantes (cajas de texto, grillas, botones, et c.). Como parte del diseño de las interfases, deberá definir los métodos propios de este tipo de clases. Estos métodos deberán definirse inmediatamente después de los constructores, esto para no mezclarlos con el código que se genera con los eventos.
Clase
Métodos
private void mostrarAlumnos () { } private void mostrarEstadisticas() {
Herencia y Polimorfismo
Página 3 de 14
UPC – EPE - POO
Prof. Estanislao Contreras }
VistaAlumnos
private void mostrarCalificacion() { } private void mostrarCalificacion(String codigoAlumno) { VistaCalificacionPractica
} Y VistaCalificacionTradicional
private void actualizarCalificacion (String codigoAlumno) { }
Paso 2: Generación del proyecto UML e ingeniería reversa del proyecto Java Crear el proyecto UML considerando un modelo de ingeniería reversa. Considerar como nombre del proyecto UMLTransiBPM y asegurarse de tomar el proyecto Java como base. Paso 3: Creación de los diagramas de clase en el proyecto UML Crear un diagrama de clase el interior del paquete transibpm del proyecto UMLTransiBPM Elaborar el diagrama considerando los conceptos de herencia y polimorfismo que aplican para el presente caso: Herencia de clases Nivel de visibilidad protected para atributos y métodos Generalización Especialización Clases Abstractas Métodos Abstractos Métodos Redefinidos Responda las siguientes preguntas:
¿Encuentra usted el escenario para establecer relaciones de herencia?
¿Entre que clases identificadas se puede establecer relaciones de herencia? ¿Por qué?
¿Es posible una herencia directa entre dichas clases? ¿Por qué?
En caso de no ser posible la herencia directa, ¿Cómo soluciona el problema?. Explique el proceso.
¿Existen métodos abstractos? ¿Por qué? ¿Qué hay de los métodos redefinidos?
¿Existe herencia implícita?
3.1 Generalización
Definición de la Clase Generalizada: Clase Abstracta Calificacion
Herencia y Polimorfismo
Página 4 de 14
UPC – EPE - POO
Herencia y Polimorfismo
Prof. Estanislao Contreras
Página 5 de 14
UPC – EPE - POO 3.2 Especialización
Prof. Estanislao Contreras Definición de las Clases Especializadas
Calificación Tradicional
Calificación Práctica
Herencia y Polimorfismo
Página 6 de 14
UPC – EPE - POO
Prof. Estanislao Contreras
3.3 Resultado del Proceso de Generalización-Especialización
3.4 Utilización de la clase abstracta Calificacion
Herencia y Polimorfismo
Página 7 de 14
UPC – EPE - POO
Prof. Estanislao Contreras
3.5 Definición de la Controladora y uso de la misma por las Vistas
Unidad 4-5: Herencia y Polimorfismo
Página 8 de 14
UPC – EPE - POO
Prof. Estanislao Contreras
3.5 Diagrama de Clases Final
Paso 4: Generación de las clases Java a partir del diagrama de clases planteado Seleccione los elementos del modelo del proyecto UML de los cuales desea generar el código Java. Asegurarse de seleccionar el proyecto java TransiBPM como proyecto destino. Con esto, ya se tiene los elementos necesarios en el proyecto Java, para programar el flujo de mensajes entre los objetos que serán instancias de las clases declaradas.
Herencia y Polimorfismo
Página 9 de 14
UPC – EPE - POO
Prof. Estanislao Contreras
Paso 5: Implementación de métodos y eventos Calificacion.java 1. 2. 3. 4. 5. 6. 7. 8. 9.
public abstract class Calificacion { . . . public Calificacion () { this.examenParcial = 0.00; this.examenFinal = 0.00; } public abstract double calcularPromedioFinal (); . . }
Conceptos Clave - Clase abstracta - Método abstracto - Polimorfismo
CalificacionPractica.java 10. public class CalificacionPractica extends Calificacion { 11. . . . 12. public CalificacionPractica () {
13.
super();
14. this.trabajo1 = 0.00; 15. this.trabajo2 = 0.00; 16. } 17. . . . 18. public double calcularPromedioFinal () { 19. return 0.15*this.examenParcial + 20. 0.25*this.examenFinal + 21. 0.10*this.trabajo1+ 22. 0.10*this.trabajo2+ 23. 0.20*this.proyecto; 24. } 25. 26. }
Conceptos Clave - Herencia - Invocación a métodos del ancestor - Redefinición de métodos - Polimorfismo
CalificacionTradicional.java 27. public class CalificacionTradicional extends Calificacion { 28. . . . 29. public CalificacionTradicional () {
30.
super();
31. this.practica1 = 0.00; 32. this.practica2 = 0.00; 33. } 34. . . . 35. public double calcularPromedioFinal () { 36. return 0.30*this.examenParcial + 37. 0.30*this.examenFinal + 38. 0.20*this.practica1+ 39. 0.20*this.practica2; 40. } 41. }
Conceptos Clave - Herencia - Invocación a métodos del ancestor - Redefinición de métodos - Polimorfismo
Alumno.java 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
public class Alumno { . . . public Alumno (String codigo, String nombre, String modalidad) { this.codigo = codigo; this.nombre = nombre; this.modalidad = modalidad; if (modalidad.equals("Practica")){ this.calificacion = new CalificacionPractica(); } else { this.calificacion = new CalificacionTradicional(); } } . . . }
Herencia y Polimorfismo
Conceptos Clave - Uso de objetos genéricos o polimórficos - ¿De quién hereda Alumno?
Página 10 de 14
UPC – EPE - POO
Prof. Estanislao Contreras Transi.java
57. public class Transi { 58. . . . 59. public Transi () { 60. this.alumnos = new ArrayList
(); 61. } 62. . . . 63. public void registrarAlumno (String codigo, String nombre, String modalidad) { 64. this.alumnos.add(new Alumno(codigo,nombre, modalidad)); 65. } 66. 67. public Alumno buscarAlumno (String codigoAlumno) { Conceptos Clave 68. Alumno alumnoEncontrado = null; - ¿De quién hereda Transi? 69. for(Alumno alumno:alumnos){ - Uso de métodos polimórficos 70. if (alumno.getCodigo().equals(codigoAlumno)){ 71. alumnoEncontrado = alumno; - Type Casting a objetos 72. break; genéricos para ejecutar 73. } métodos específicos 74. } 75. return alumnoEncontrado; 76. } 77. 78. public void eliminarAlumno (String codigoAlumno) { 79. Alumno alumno = buscarAlumno(codigoAlumno); 80. alumnos.remove(alumno); 81. } 82. 83. public double calcularPromedioFinalMayor () { 84. double promedioMayor = 0.0; 85. for(Alumno alumno:alumnos){ 86. double promedioAlumno = alumno.getCalificacion().calcularPromedioFinal(); 87. if (promedioAlumno>promedioMayor){ 88. promedioMayor = promedioAlumno; 89. break; 90. } 91. } 92. return promedioMayor; 93. } 94. 95. public double calcularPromedioFinalMenor ( ) { 96. double promedioMenor = calcularPromedioFinalMayor(); 97. for(Alumno alumno:alumnos){ 98. double promedioAlumno = alumno.getCalificacion().calcularPromedioFinal(); 99. if (promedioAlumno
Herencia y Polimorfismo
Página 11 de 14
UPC – EPE - POO 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152.
Prof. Estanislao Contreras
} } public boolean registrarCalificacionPractica (String codigoAlumno, double examenParcial, double examenFinal, double trabajo1, double trabajo2, double proyecto) { Alumno alumno = buscarAlumno(codigoAlumno); if (alumno != null){ alumno.getCalificacion().setExamenParcial(examenParcial); alumno.getCalificacion().setExamenFinal(examenFinal); ((CalificacionPractica)alumno.getCalificacion()).setTrabajo1(trabajo1); ((CalificacionPractica)alumno.getCalificacion()).setTrabajo2(trabajo2); ((CalificacionPractica)alumno.getCalificacion()).setProyecto(proyecto); return true; } else { return false; } } . . . }
VistaAlumnos.java 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201.
package transibpm; import import import import
javax.swing.DefaultListSelectionModel; javax.swing.JDialog; javax.swing.JOptionPane; javax.swing.table.DefaultTableModel;
Conceptos Clave - Uso de métodos polimórficos - Uso de objetos genéricos para clases Vista
public class VistaAlumnos extends javax.swing.JFrame { private Transi transi; private DefaultTableModel tableModel; public VistaAlumnos() { initComponents(); transi = new Transi(); tblAlumnos.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION); tableModel = (DefaultTableModel) tblAlumnos.getModel(); mostrarAlumnos(); mostrarEstadisticas(); } private void mostrarAlumnos(){ tableModel.setRowCount(transi.getAlumnos().size()); for(int i=0; i
Herencia y Polimorfismo
Página 12 de 14
UPC – EPE - POO 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242.
Prof. Estanislao Contreras vistaCalificacion.setVisible(true); vistaCalificacion.dispose(); mostrarAlumnos(); mostrarEstadisticas();
} } . . . private void btnRegistrarAlumnoActionPerformed(java.awt.event.ActionEvent evt) { String codigo = txtCodigo.getText(); String nombre = txtNombre.getText(); String modalidad = cbxModalidad.getSelectedItem().toString(); if (! codigo.equals("") && ! nombre.equals("")){ if (transi.buscarAlumno(codigo) == null){ transi.registrarAlumno(codigo, nombre, modalidad); mostrarAlumnos(); mostrarEstadisticas(); txtCodigo.setText(""); txtNombre.setText(""); txtCodigo.requestFocusInWindow(); } else { JOptionPane.showMessageDialog(rootPane, "Código ya existe"); } } } private void btnCalificacionActionPerformed(java.awt.event.ActionEvent evt) { mostrarCalificacion(); } private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) { int filaSeleccionada = tblAlumnos.getSelectedRow(); if (filaSeleccionada != -1){ String codigoAlumno = tableModel.getValueAt(filaSeleccionada, 0).toString(); transi.eliminarAlumno(codigoAlumno); mostrarAlumnos(); mostrarEstadisticas(); } } }
VistaCalificacionPractica.java 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271.
package transibpm; public class VistaCalificacionPractica extends javax.swing.JDialog { private Transi transi; public VistaCalificacionPractica(java.awt.Frame parent, boolean modal,Transi transi, String codigoAlumno) { super(parent, modal); Conceptos Clave initComponents(); - Type Casting a objetos this.transi = transi; mostrarCalificacion(codigoAlumno); genéricos para ejecutar }
métodos específicos
private void mostrarCalificacion(String codigoAlumno){ Alumno alumno = transi.buscarAlumno(codigoAlumno); txtCodigo.setText(codigoAlumno); txtNombre.setText(alumno.getNombre()); txtParcial.setText(String.valueOf(alumno.getCalificacion().getExamenParcial())); txtFinal.setText(String.valueOf(alumno.getCalificacion().getExamenFinal())); txtTB1.setText(String.valueOf( ( (CalificacionPractica)alumno.getCalificacion() ).getTrabajo1())); txtTB2.setText(String.valueOf( ( (CalificacionPractica)alumno.getCalificacion() ).getTrabajo2())); txtProyecto.setText(String.valueOf( ( (CalificacionPractica)alumno.getCalificacion() ).getProyecto())); } private void actualizarCalificacion(String codigoAlumno){ double examenParcial = Double.parseDouble(txtParcial.getText()); double examenFinal = Double.parseDouble(txtFinal.getText()); double trabajo1 = Double.parseDouble(txtTB1.getText()); double trabajo2 = Double.parseDouble(txtTB2.getText()); double proyecto = Double.parseDouble(txtProyecto.getText());
Herencia y Polimorfismo
Página 13 de 14
UPC – EPE - POO 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284.
Prof. Estanislao Contreras
transi.registrarCalificacionPractica(codigoAlumno, examenParcial, examenFinal, trabajo1, trabajo2, proyecto); } . . . private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) { actualizarCalificacion(txtCodigo.getText()); setVisible(false); } private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) { setVisible(false); } }
VistaCalificacionTradicional.java 285. 286. 287. 288. 289. 290.
package transibpm; public class VistaCalificacionTradicional extends javax.swing.JDialog { private Transi transi; public VistaCalificacionTradicional(java.awt.Frame parent, boolean modal, Transi transi, String codigoAlumno) { super(parent, modal); this.transi = transi; Conceptos Clave initComponents(); - Type Casting a objetos mostrarCalificacion(codigoAlumno); } genéricos para ejecutar
291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303.
métodos específicos private void mostrarCalificacion(String codigoAlumno){ Alumno alumno = transi.buscarAlumno(codigoAlumno); txtCodigo.setText(codigoAlumno); txtNombre.setText(alumno.getNombre()); txtParcial.setText(String.valueOf(alumno.getCalificacion().getExamenParcial())); txtFinal.setText(String.valueOf(alumno.getCalificacion().getExamenFinal())); txtPC1.setText(String.valueOf( ( (CalificacionTradicional)alumno.getCalificacion() ).getPractica1())); txtPC2.setText(String.valueOf( ( (CalificacionTradicional)alumno.getCalificacion() ).getPractica2())); }
304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324.
private void actualizarCalificacion(String codigoAlumno){ double examenParcial = Double.parseDouble(txtParcial.getText()); double examenFinal = Double.parseDouble(txtFinal.getText()); double practica1 = Double.parseDouble(txtPC1.getText()); double practica2 = Double.parseDouble(txtPC2.getText()); transi.registrarCalificacionTradicional(codigoAlumno, examenParcial, examenFinal, practica1, practica2); } . . . private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) { actualizarCalificacion(txtCodigo.getText()); setVisible(false); } private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) { setVisible(false); } }
Paso 6: Actualización de los modelos UML mediante ingeniería reversa Si hizo cambios en las clases, ya sea que se añadió, modificó o eliminó atributos, métodos o clases se deberá actualizar los elementos del modelo en el proyecto UML. Para realizar esto, considerando las clases del proyecto Java, realizar la Ingeniería Reversa. Se puede considerar el proyecto actual UML como destino o crear uno nuevo.
Herencia y Polimorfismo
Página 14 de 14