1 / 67

Jerarquía de Clases: Herencia, Composición y Polimorfismo

Jerarquía de Clases: Herencia, Composición y Polimorfismo. Programación II Dr. Javier Nieves Acedo. Este tema es “la clave” …. … es el poder de la POO …. … para hacer lo que queramos …. … incluso algo mejor …. … ;-) …. … o más divertido …. … pero usando jerarquias ….

brenna
Download Presentation

Jerarquía de Clases: Herencia, Composición y Polimorfismo

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Jerarquía de Clases: Herencia, Composición y Polimorfismo Programación II Dr. Javier Nieves Acedo

  2. Este tema es “la clave”…

  3. … es el poder de la POO …

  4. … para hacer lo que queramos…

  5. … incluso algo mejor…

  6. … ;-)…

  7. … o más divertido…

  8. … pero usando jerarquias…

  9. Herencia (1) • Hay una relación de herencia entre clases cuando se cumple la frase “es un”: Vehículo “ES UN” Coche Camión Moto

  10. Herencia (2) • Cuando se realiza una herencia (generalización) se obtienen los atributos y los métodos miembros de la clase padre. Clase Atributo Declaración Representación A dato a A a1; a B dato b B b1; b c C dato c C c1;

  11. Herencia (3) • Tipos de Herencia: • Herencia Simple: una clase base o padre • Herencia Múltiple: más de una clase base o padre. • Java únicamente permite herencia simple pero provee un mecanismos para simularla. • Otros lenguajes soportan la herencia múltiple (C++)

  12. Herencia (4) • Los métodos y los atributos se heredan hacia abajo en la jerarquía. • En Java, todas las clases derivan de la clase Object. • Las clases superiores describen un comportamiento más general. Las inferiores más específico.

  13. Herencia (5) • Las clases hijas heredan (tienen) todos los atributos o métodos de la clase superior • Solo puede acceder a los que no sean privados • La solución actual es poner todo a public • No se trata de la solución óptima • Como implementarla: publicclass <nombreClase> extends <nombreClaseBase> { … }

  14. Herencia (6) • Las clases base deben ser accesibles: • Estar en el mismo paquete. • Estar declarada en otro paquete como public. • No estar declarada como final • La relación de herencia es trnsitiva • A  B, B  C, entonces, A C • Si no hay clausula extends, la clase hereda de java.lang.object

  15. Herencia (7) • Ejemplo (1): publicclass Persona { publicString nombre; publicStringdireccion; publiclongtelefono; public Persona() {…} publicPersona pedirDatosPersona() {…} }

  16. Herencia (8) • Ejemplo (2): Publicclass Empleado extends Persona { publicintantiguedad; publicintcategoria; publicinttestAntig() {…} } ¿Qué atributos y métodos tiene la clase Empleado?

  17. Herencia (7) • Los constructores no se heredan. • En la practica: • No se generan objetos de la clase base. • Está para proporcionar el formato común.

  18. Herencia (7) • Ventajas • Reutilización de código • Diferenciación de código (menos cláusulas if)

  19. Herencia (8) • Consideraciones al heredar • Los atributos son todos nuevos • Si se repite algún nombre, se oculta el del padre • Sigue existiendo pero no se puede acceder directamente. • Se puede acceder a través de métodos • No es recomendable

  20. Herencia (9) • Consideraciones al heredar • Los métodos son nuevos o modificados • Override Redefinición del método • Los métodos modificados deben • Respetar la cabecera (sino es nuevo) • No pueden bajar la visibilidad, sí subirla • private [], protected, public • []  protected, public • protected  public

  21. Herencia (10) • Consideraciones al heredar • static • Los atributos estáticos del padre se pueden usar pero no se heredan. • Los métodos estáticos del padre se pueden usar pero no se heredan. • Los constructores nunca se heredan, las clases deben definir los suyos propios.

  22. … la herencia parece fantástica…

  23. … pero nos estamos saltando…

  24. … la encapsulación…

  25. … y la solución es …

  26. Acceso abstract(1) • Sirve para proporcionar comportamiento común a varias clases. • Indica que es una clase incompleta. • La clase puede (no es obligatorio) tener algunos métodos declarados pero no implementados. • Las clases con este modificador no pueden instanciarse.

  27. Acceso abstract(2) • Ejemplo: abstractclass Punto //clase abstracta { int x; int y; void mover(int x, int y) { this.x += x; this.y += y; } abstractvoiddibujar(); //método abstracto } abstractclassPuntoColoreableextends Punto { int color; } classPuntoSimpleextends Punto { voiddibujar() { System.out.println(“(”+ x + ”,” + y + ”)”); } }

  28. Acceso abstract(3) • Un método abstracto es el que no tiene implementación (diferente a vacío). • Una clase que contiene un método abstracto es abstracta y debemos ponerle el modificador de abstracto.

  29. Acceso abstract(4) • Cuando una clase hereda un método abstracto puede… • Implementar el método (darle código) • No implementarlo y se mantiene la clase como abstracta. • Una clase es abstracta si • Tiene un método abstracto • Hereda un método abstracto y no lo implementa

  30. Acceso abstract(4) • Utilidad de los métodos abstractos • Las clases abstractas definen como tienen que comportarse las hijas, métodos obligatorios. • Indica el comportamiento pero no compromete a un comportamiento en concreto. • Pueden existir métodos que no sean abstractos porque sí que se puede definir.

  31. Acceso final • Indica que la definición de la clase está completa. • No se puede heredar (no puede tener subclases). • Si una clase se declara como abstract y final, error de compilación.

  32. Acceso public • La clase es accesible por clases de otros paquetes. • Solo una clase public por fichero de código fuente. • Las otras clases, si las hubiera, serían privadas.

  33. Acceso protected(1) • No es bueno perder la ocultación de métodos y atributos privados para hacer una generalización. • Existe otro modo de acceso que solo tiene sentido en relaciones de herencia o generalización. • Atributos y Métodos accesibles por las clases hijas y el mismo paquete.

  34. Acceso protected(2) • Ejemplo: publicclass Base1 { int a; // Sin modificador. Disponibles int b; // a la clase y las del mismo paquete. protectedint c; // Disponibles solo a la propia // clase, el paquete, protectedint d; // y a las clases derivadas. publicint e; // Disponibles a todas las // clases y el paquete, así como publicint f; // a otras partes del programa. }

  35. Acceso protected(3) • Las clases base no suelen tener miembros privados • Las clases hijas necesitan acceder a sus elementos

  36. … ahora los constructores son más importantes …

  37. Constructores y Herencia (1) • Los constructores no se heredan • Hay que estudiar su funcionamiento • Hasta ahora, pasos del constructor: • Crea el objeto, reserva espacio y conecta nombre y memoria • Ejecuta instrucciones • Pero esta forma puede dar problemas…

  38. Revisemos la cadena de constructores

  39. Constructores y Herencia (2) • IMPORTANTE: • El constructor de una clase derivada no puede construirse hasta que se construya a su padre • Cada constructor inicializa sus atributos • Primero los padres

  40. Constructores y Herencia (3) • Si hay mas de una generalización, la clase se preocupa de crear el padre más cercano Clase Base A construye a su padre Clase Derivada B construye a su padre Clase Derivada C

  41. Constructores y Herencia (4) • El constructor de la clase derivada tiene que utilizar el método super(…) para construir a su padre. • Si el programador no lo hace, Java llama automáticamente al método super()

  42. Referencias this y super(1) • this: • Referencia a la propia instancia con la que se está trabajando. • No hace falta usarla para acceder a los métodos o atributos de instancia. • A veces es necesaria su utilización • Desambiaguación de términos • Pasar la referencia del propio objeto: • panel.dibujaObjeto(this);

  43. Referencias this y super(2) • super: • Permite referenciar a la clase padre. • Se emplea cuando se ha definido un método y se quiere acceder al método del padre (sino se llamaría al de la clase). • Permite llamar al constructor de la clase padre desde la clase hija. Esta llamada debe ser la primera del constructor hijo.

  44. Referencias this y super(3) classRectangulo { publicublicvoidsaludar() { System.out.println("Hola, soy Rectangulo, y saludo"); } } class Cuadrado extendsRectangulo { publicvoidsaludar() //Método redefinido { System.out.println(“Hola, soy un cuadrado”); } publicvoidsaludos() { saludar(); //Hola, soy un cuadrado this.saludar(); //Hola, soy un cuadrado super.saludar(); //Hola, soy Rectangulo, y saludo } public static void main (String[] args) { Cuadrado c1 = new Cuadrado(); c1.saludos(); } }

  45. … pero hay otras relaciones…

  46. Composición (1) • Hay una relación de composición entre clases cuando se cumple la frase “tiene un”: Vehículo “TIENE UN” Motor Chasis Carrocería

  47. Composición (2) • Los constructores y destructores son importantes en las relaciones de composición: • No se puede construir un objeto hasta que están construidos todos los que lo componen

  48. Composición (3) • Pautas de construcción (1): • Constructor de la clase recibe todo lo necesario para crear todas las clases. • El compilador construye primero los miembros y luego el contenedor

  49. Composición (5) • Pautas de construcción (2): • La clase compuesta no puede acceder a los miembros privados de las clases que la componen. • Para evitar un paso excesivo de parámetros se pueden crear los objetos y pasarlos como parámetros a la clase compuesta

  50. Composición (6) class Persona { Persona padre; //Atributo de tipo clase String nombre; public Persona(Persona pPadre, String pNombre) { padre = pPadre; nombre = pNombre; } public String saluda() { return nombre; } public Persona getPadre() { return padre; } public static void main (String args[]) { Persona filiberto = new Persona(null,"Filiberto"); Persona pablo = new Persona( filiberto, "Pablo" ); Persona nuria = new Persona( filiberto, "Nuria" ); Persona alberto = new Persona( nuria, "Alberto" ); //El nieto es Alberto System.out.println("El nieto es: " + alberto.saluda()); //La madre es Nuria System.out.println("La madre: " + alberto.getPadre().saluda()); //El abuelo es Filiberto System.out.println("El abuelo es: " + alberto.getPadre().getPadre().saluda()); } }

More Related