Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 15 1.9. Relaciones entre objetos 1.9.1. Notación UML e implementación estática en Java de relaciones (la simbología de los diagramas pueden cambiar de un autor a otro) Modelo Descripción Implementación Herencia o generalización: Son las relaciones donde una clase hereda propiedades de otra. class B extends A { } Asociación: Establecen alguna forma de comunicación entre dos clases. Cuando hay multiplicidad, pueden implementarse con arreglos o usando contenedores. class A { public B otorga[]; } class B { public A pide; } Asociación unidireccional: Similar a la anterior, pero califica el sentido de la comunicación. Uno a muchos class A { } class B { public A cobra[]; } PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 16 Agregación: Son una forma de asociación y se usan para representar la situación de que un objeto de una clase esté “agregado” dentro de otro que pertenece a otra clase: Agregación - Uno o más objetos están lógicamente contenidos dentro de otro/s. El objeto agregado, existe independientemente de aquel que lo “contiene”. Composición - Un objeto es físicamente construido a partir de otro. Esto implica que al destruir el objeto “compuesto”, también se destruye el objeto “interno”. Agregación: class A { } class B { public A contenido[]; } Composición: class A { public B incorporar[]; } class B { public A contenido; } Dependencia o instanciación: Se da cuando un elemento del modelo, depende de modo tal que si el primero se modifica, el segundo se ve afectado o cuando un método de un objeto, crea un objeto de otra clase. Por ejemplo si A: Stock y B: OrdenDeCompra, una venta va a implicar la modificación del estado de los objetos que pertenecen a las dos clases. Se trata de una relación dinámica (no es estática). B x = new A(); ... x.unMetodo(); Realización o implementación: Ocurre entre: Class e Interface Interface y Class Component e Interface Package e Interface Package y Class Indica que la primera implementa una operación u propiedad definida en la segunda. interface A { void almacenar(); } class B implements A { void almacenar(){} } PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 17 Clase asociativa: Se trata de una clase que describe una relación de asociación entre otras dos clases. Por ejemplo los objetos de la clase D podrían servir como argumentos en la activación de métodos, que implementan la relación estática existente. class A { public B theB; } class B { public A graba[]; } class D { } ? Por qué existen las clases Integer, Float, etc. si ya se cuenta con los tipos int, float, etc. 1.9.2. Herencia Es la propiedad de heredar atributos y comportamientos de clases superiores en jerarquía, llamadas superclases o clases bases, esta característica permite aumentar el grado de reusabilidad de los componentes del sistema. En cada caso se debe analizar si lo que existe entre dos clases, es una relación de herencia, o una relación de “continencia” de una dentro de otra. La primera suele darse cuando se puede expresar que una clase "es un/a", la segunda habitualmente cuando se da la forma "tiene un/a". Normalmente para poder entender la utilidad de una clase, es necesario estudiar sus superclases. Una de las tareas más difíciles, es analizar y diseñar adecuadamente, la estructura de relaciones y dependencias que existen entre las clases de un sistema, y un error “grueso” en esta parte puede llevar a la inutilización de todo el desarrollo. Existen dos tipos de herencias, la simple y la múltiple. Herencia simple Se da cuando una clase hereda propiedades, solamente de una única clase de superior en jerarquía. Los mecanismos de herencia, son los que permiten crear las jerarquías de clases estructuradas en los denominados árboles de herencia, que a su vez hacen posible aplicar el concepto de construcción incremental de software. EJEMPLO Se quieren modelar diversas figuras geométricas. En el ejemplo, las clases, Circulo, Irregular y Rectángulo, heredan los atributos propiedades (atributos) y los comportamientos (métodos) de la clase Figura; mientras que Triangulo y Trapecio heredan de Irregulares y por lo tanto también de Figura en forma transitiva. Cada figura es fabricada con el mismo tipo de material, el cual tiene un determinado precio por centímetro cuadrado. El precio de una figura cualquiera se calcula multiplicando el valor del precio por la superficie de la figura y por el espesor del material. PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 18 1. abstract class Figura { 2. protected float espesor; 3. public static final float precio = 5.35; 4. public Figura(float e){ 5. espesor = e; 6. } 7. public abstract double superficie(); 8. public abstract double perimetro(); 9. public float costo() { return superficie() * precio * espesor; } 10. } 11. class Rectangulo extends Figura { 12. protected double alto, ancho; 13. public Rectangulo(float e, double l, double n){ 14. super(e); 15. alto = l; 16. ancho = n; 17. } 18. public double superficie(){ return alto * ancho; } PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 19 19. public double perimetro(){ return alto * 2 + ancho * 2; } 20. } 21. abstract class Irregulares extends Figura { 22. protected double altu; 23. public Irregulares(float e, double h){ 24. super(e); 25. altu = h; 26. } 27. } 28. class Triangulo extends Irregulares { 29. private double hipot; 30. public Triangulo(float e, double h, double t){ 31. super(e, h); 32. hipot = t; 33. } 34. public double superficie(){ 35. return Math.sqrt(hipot * hipot - altu * altu)) * altu / 2; 36. } 37. public double perimetro(){ 38. return altu + hipot + Math.sqrt(hipot * hipot - altu * altu))); 39. } 40. } 41. class Trapecio extends Irregulares { 42. private double bmayor, bmenor; 43. public Trapecio(float e, double h, double m, double n){ 44. super(e, h); 45. bmayor = m; 46. bmenor = n; 47. } 48. public double superficie(){ return (bmayor + bmenor) * altu * 2; } 49. public double perimetro(){ return 0; } 50. } 51. class Circulo extends Figura { 52. private final double PI = 3.14; PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 20 53. protected double radio; 54. public Circulo(float e, double r){ 55. super(e); 56. radio = r; 57. } 58. public double superficie(){ return PI * radio; } 59. public double perimetro(){ return PI * radio * 2; } 60. } Comentarios acerca del programa: 1: Queuna clase sea abstracta implica que no pueden crearse objetos de la clase. Se usa cuando se quieren representar conceptos que no tienen instancias. En este caso el concepto de Figura es una generalización, que no tiene una instancia concreta a menos que se indique de que figura se trata. 2: Si se califica protected un miembro de la clase, sólo es accesible desde esta y desde las subclases. 3: Calificar un atributo como static especifica que se trata de una variable de clase, hacerlo como final especifica que se trata de una constante. 4: No es posible crear objetos de esta clase pero el constructor se usará para construir los subobjetos que forman parte de los objetos que se creen de las clases derivadas. 7, 8: Si se califican abstract implica que no se implementan en la clase, pero que sí se deben implementar en las subclases, sino estas también pasan a ser abstractas. 11: El especificador extends indica la clase desde la cual se hereda. 14: La llamada al método predefinido super, hace que se ejecute el constructor de la superclase. Esta llamada debe ser la primera que aparezca en el constructor de una clase derivada de otra. 18, 19: Se implementan los métodos abstractos de la superclase, a esto se le llama sobre-escritura de métodos (o redefinición), no confundir con sobrecargar un método dentro de una clase. En el caso de la sobre-escritura de métodos, los prototipos de ambos deben ser exactamente iguales. 29: Se califica privado, para que no se pueda acceder desde la subclase. 35: Aquí se utiliza el método de clase sqrt(), perteneciente a la clase Math, para lo cual hay que importar el package java.lang.Math 49: En este caso se ha supuesto que el modelo no requiere que se implemente este cálculo. Por lo tanto se ha realizado una implementación trivial del método, esto implica modelar un comportamiento “vacío”, de modo que se cumple con el requisito de sobre-escribir el método para evitar que la subclase también sea abstracta, cuando se active esta función regresará el valor 0. PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 21 Supongamos que creamos la siguiente clase para probar el programa: 1 2 3 4 5 6 7 8 9 10 public class pruebaFiguras { public static void main(String [] arg){ Figura a; a = new Rectangulo(3.5, 5.0, 7.0, 9.0); System.out.println(a.superficie()); a = null; a = new Circulo(6.1, 3.4, 12.5); System.out.println(a.superficie()); } } 3: Si bien no pueden crearse objetos de la clase Figura es posible declarar variables de ese tipo. La ventaja de esto es que con esas variables podemos referenciar objetos de cualquiera de las subclases (siempre y cuando se puedan crear esos objetos). 4: Aquí se crea un objeto de la clase Rectangulo, que es referenciado con la variable ‘a’ que es la clase Figura, esto es válido ya que el objeto creado no es de la clase Figura, sino de la Rectangulo. Resumiendo podemos decir que con una variable del tipo de una superclase, es posible referenciar objetos de cualquiera de las subclases de aquella. 5: Se activa el método superficie() del objeto Rectangulo, ya que es el que referencia la variable ‘a’. 6: Esto anula la referencia al objeto Rectangulo y hace que quede disponible para su destrucción. 7: Ahora se crea un objeto de la clase Circulo. En este caso si en el paso anterior no se hubiera asignado null, daría lo mismo ya que la referencia al objeto Rectangulo, igual se perdería, con lo que quedaría de todos modos disponible para su destrucción. 8: Se activa el método superficie(), pero ahora el del objeto Circulo, ya que es el que en este momento referencia la variable ‘a’. La característica de activar el método que corresponde al objeto referenciado en un momento dado, se denomina polimorfismo. Esto es lo que se describe en el modelo de objetos como “la propiedad de los objetos de reaccionar a un mensaje con el método apropiado”. ? Cuál es la utilidad de this y super, usadas como referencias. Herencia múltiple Se da cuando una clase hereda en forma simultánea, propiedades de más de una clase de jerarquía superior. En este caso puede ocurrir que una subclase, herede dos métodos con igual nombre pero comportamientos diferentes por dos ramas distintas. En situaciones como estas, se requiere especificar explícitamente la clase a la que pertenece el método o variables de instancia, que se desean acceder. En el desarrollo de un programa O.O., aunque no es lo más frecuente, a veces existe la necesidad de describir jerarquías de herencia múltiple, como resultado de la identificación de las abstracciones y sus interrelaciones, que participan en el problema. PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 22 En Java la herencia múltiple está limitada, y sólo es posible utilizando interfaces, que son clases abstractas puras (todos los métodos abstractos y todos los atributos constantes). EJEMPLO Si analizamos el diagrama que herencia de vehículos que se muestra más abajo, veremos que el esquema nos permite heredar atributos y comportamientos de más de una clase superior. En este caso un CAMION es un VEHÍCULO de CARGA, relación expresada a través de TRANSPORTE, por lo tanto un objeto CAMION hereda las propiedades (atributos y métodos) de todas las clases de la cual hereda, aunque esto no implica que tenga acceso directo a ellos (depende de los calificadores -private, #protected, +public). ? En qué se diferencian una interface de una clase abstracta. 1.9.3. Agregación Ocurre cuando una clase no hereda propiedades de otra, sino que, está incluida en otra. En este caso una es la clase “continente” y la otra la “contenida”. Esta propiedad, como en la herencia, permite rehusar clases para construir otras. Las relaciones de agregación normalmente se dan cuando se pueden expresar en términos "está formado por" o visto desde el otro lado “forma parte de”. ¿Podemos hablar de que un auto está compuesto por un motor? Si la respuesta es afirmativa, entonces estamos en presencia de una relación de agregación. Las relaciones que implican un vínculo más fuerte, se las denomina de composición. Por ejemplo: PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 23 a) un objeto MOTOR está formado por un CARBURADOR (agregación) b) un objeto CUERPO_HUMANO está compuesto por CEREBRO (composición) Por supuesto que no siempre las relaciones surgen en forma tan evidente. Normalmente esto implica que se debe realizar un análisis más profundo del problema a modelar. ? Cómo sería la implementación de las relaciones del siguiente modelo. 1.9.4. Asociación Se da cuando un objeto de una clase está vinculado a un objeto de otra clase, de modo tal que existe una relación pero que no es de agregación. Por ejemplo en el modelo de un sistema de alumnos de la Facultad, entre un objeto ALUMNO y un objeto EXAMEN (ya rendido), sería difícil hablar de que uno de ellos contiene al otro, pero evidentemente existe un vínculo entre ambos (que podría expresarse como que un ALUMNO � RINDIO � EXAMEN). EJEMPLO Implementar en Java el siguiente modelo sobre el Registro de Automotores, con seis clases (una de ellas un actor), donde Formulario08 (que sirve también como clase asociativa para la relación de posesión) se utiliza para representar los datos de inscripción de un Vehículo. PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 24 Así, el Propietario de un Vehículo lo inscribe en el RNA (relación inscribe), lo que implica la creación de un objetoFormulario08, para registrar la inscripción (relación de inscripción). ? Cuáles son las diferentes formas de relaciones de asociación, que aparecen en el modelo anterior y cómo sería la implementación. 1.10. Excepciones Una excepción es un tipo de error o condición anormal que aparece durante la ejecución de un programa. Algunas excepciones críticas hacen que se deba finalizar la ejecución del programa, por ejemplo un fallo a nivel del hardware. Otras en cambio sí son recuperables, como por ejemplo el no encontrar un archivo del cual hay que leer datos. Los sucesos que tienen lugar cuando se produce una excepción son: 1. se interrumpe la ejecución del código del programa que se estaba ejecutando. 2. se crea un objeto de la clase que maneja ese tipo de excepciones y se pasa la referencia del objeto creado, al método que ha provocado el error. 3. finalmente el método puede gestionar la excepción (capturarla), o dejar que la trate el gestor por defecto del intérprete Java. En este último caso se mostrará un mensaje describiendo la excepción, la traza de la pila de llamadas desde el lugar donde se produjo la excepción y se finaliza el programa. La gestión de excepciones en Java se especifica a través de las siguientes palabras reservadas: try, catch, throw, throws y finally. Las sentencias try y catch forman una unidad. El objeto de la sentencia try es indicar que sentencia/s PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 25 puede llegar a producir una excepción. El fin de la sentencia catch es indicar dónde se resuelve la condición que provocó la excepción, para luego continuar la ejecución del programa como si el error no hubiese ocurrido. Cuando surge una excepción el control del programa se transfiere desde el bloque try al bloque catch. Una vez que se ha ejecutado la sentencia catch, el control del programa continúa en la línea siguiente después del bloque try/catch. Si resulta necesario forzar la ejecución obligatoria de determinado código al procesar un bloque try, se indica agregando un bloque finally. Forma de uso: try { // bloque de código que puede producir las excepciones TipoExcepción1, TipoExcepción2 } catch (TipoExcepción1 ex) { // gestor de excepciones para TipoExcepción1 } catch (TipoExcepción2 ex) { // gestor de excepciones para TipoExcepción2 } finally { // bloque de código que se ejecutará en forma obligatoria, // al finalizar la ejecución del bloque try o alguno de sus catch } Para especificar el lugar del programa donde se va a lanzar una excepción, se utiliza la palabra clave throw. Si un método lanza una excepción, esta debe ser especificada en la cabecera de la declaración del método mediante la palabra throws. EJEMPLO class MiExcepcion extends Exception { private int codigo; MiExcepcion(int a) { codigo = a; } public String toString() { return "MiExcepcion[" + codigo + "]"; } } class PruebaExcepcion { static void calcular(int a) throws MiExcepcion { System.out.println("Se llama a calcular(" + a + ")"); if(a > 10) throw new MiExcepcion(a); System.out.println("Salida normal"); } public static void main(String args[]) { try { calcular(1); calcular(20); } catch (MiExcepcion e) { System.out.println("Capturada " + e); } } } Si un método redefine un método de una superclase calificado con throws, el método de la clase PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 26 derivada no tiene obligatoriamente que lanzar todas las excepciones de la clase base. Es posible en el método de la subclase lanzar las mismas excepciones o menos, pero no puede lanzar más. No puede tampoco lanzar nuevas excepciones ni excepciones de una clase más general. ? Cómo se determina el acceso a un archivo entre los packages, suponiendo que están agrupadas las clases del siguiente modo en 3 paquetes (ErrorDeEvaluacion, MetodoNumerico, Simpson, Trapecios) (FuncionIntegral, IntegralDefinida) (el resto de las clases). El lenguaje tiene definida una jerarquía de clases de excepciones, a la cual se le pueden agregar nuevas clases. Throwable Error LinkageError ClassCircularityError ClassFormatError ExceptionInInitializerError IncompatibleClassChangeError AbstractMethodError IllegalAccessError InstantiationError NoSuchFieldError PARADIGMAS DE PROGRAMACION Universidad Tecnológica Nacional Facultad Regional Mendoza Guía de programación O.O. cátedra de Paradigmas de Programación 27 NoSuchMethodError NoClassDefFoundError UnsatisfiedLinkError VerifyError VirtualMachineError InternalError OutOfMemoryError StackOverflowError UnknownError ThreadDeath Exception ClassNotFoundException CloneNotSupportedException IllegalAccessException InstantiationException InterruptedException RuntimeException ArithmeticException ArrayStoreException ClassCastException IllegalArgumentException IllegalThreadStateException NumberFormatException IllegalMonitorStateException IndexOutOfBoundsException NegativeArraySizeException NullPointerException SecurityException ? Cómo se captura una excepción.
Compartir