• Like
Tema5
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Published

 

Published in Technology , News & Politics
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,984
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
126
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1.
    • CLASES ABSTRACTAS
    • HERENCIA MULTIPLE
    • INTERFACES
    TEMA 5
  • 2. Clases Abstractas
    • Clases abstractas:
      • Clases de las que no tiene sentido crear Objetos, pero que agrupan características de clases que derivan de ellas.
      • Ejemplo :
        • Clase LavadoraMX , no tiene sentido que existan objetos (lavadoras) de esta clase:
          • existen lavadoras MX1 , MX2 y MX3deLuxe .
        • La finalidad de LavadoraMX es definir los aspectos comunes a todos los modelos de lavadoras que se fabrican.
      • Ejemplo :
        • Por la carretera no circulan Vehículos en abstracto, circulan Coches , Camiones , Bicicletas , etc...
  • 3. Clases Abstractas (Java)
    • En Java se puede indicar explícitamente que una clase es abstracta y no se pueden crear objetos de ella:
      • abstract class LavadoraMX {
      • //...
      • }
      • abstract class Vehiculo {
      • //...
      • }
  • 4. Métodos Abstractos
    • Las clases abstractas pueden (y suelen) incluir métodos sin implementación, son los llamados métodos abstractos.
    • Métodos abstractos:
      • Métodos que no tienen implementación y que obligan a ser implementados en las clases derivadas.
    • Si una clase posee un método abstracto  es clase abstracta :
      • Si una clase deriva de una clase abstracta y no implementa alguno de los métodos abstractos de la clase base, entonces hereda el método abstracto y se convierte en abstracta:
        • Para poder crear objetos hay que implementar todos los métodos abstractos heredados.
  • 5. Clases Abstractas: Ejemplo
  • 6. Clase Figura abstract class Figura { private String _nombre ; abstract public double area (); abstract public void dibujar (); public Figura (String nombreFigura) { _nombre = nombreFigura; } public boolean menorQue (Figura f) { return ( this.area() < f.area() ); } public String toString () { return ( _nombre + &quot; , &quot; + area() ); } } No es posible crear Objetos de esta clase Método sin implementación
  • 7. Clase Circulo class Circulo extends Figura { private double _radio ; private static final double PI = 3.1415926535879; public Circulo (double r) { super (&quot;Circulo&quot;); _radio = r; } public Circulo () { this (10.0); } public double area () { return ( PI * _radio * _radio ); } public void dibujar () { System.out.println (&quot;Soy un Circulo de radio: &quot; + _radio); } } Los métodos abstractos han sido implementados: Es posible crear objetos Circulo Construye la parte heredada de Figura , NO un objeto específico
  • 8. Clase Rectángulo class Rectangulo extends Figura { private double _base ; private double _altura ; public Rectangulo (double ancho, double alto) { super (&quot;Rectangulo&quot;); _base = ancho; _altura = alto; } public Rectangulo () { this (10.0, 10.0); } public double area () { return ( _base * _altura ); } public void dibujar () { System.out.println (&quot;Soy un Rectangulo de: &quot; + _base + &quot;*&quot; + _altura); } } Los métodos abstractos han sido implementados: Es posible crear objetos Rectangulo Construye la parte heredada de Figura , NO un objeto específico
  • 9. Clase Cuadrado class Cuadrado extends Rectangulo { public Cuadrado (double lado) { super (lado, lado); } public Cuadrado () { super (10.0, 10.0); } } Deriva de Rectangulo que no tiene métodos abstractos: Es posible crear objetos Cuadrado
  • 10. Ejemplo de utilización de la jerarquía de Figuras class testfiguras { public static void main (String[] args) { Figura[] fig = new Figura[3]; int menor; fig[0] = new Circulo(); fig[1] = new Cuadrado(55); fig[2] = new Rectangulo(20,30); for (int i=0; i<fig.length; i++) { System.out.println (fig[i]); System.out.println (&quot;Area: &quot; + fig[i].area()); System.out.println (&quot;Dibujar:&quot;); fig[i].dibujar(); } if ( fig[0].menorQue (fig[1]) ) menor = 0; else menor = 1; if ( fig[2].menorQue (fig[menor]) ) menor = 2; System.out.println (&quot;La figura menor es:&quot;); System.out.println (fig[menor]); } } Array de 3 Figuras ( no crea objetos ) Se crean 3 Figuras concretas y se almacenan en el array fig[i] aplica los métodos de su clase : Circulo , Cuadrado , Rectangulo
  • 11. Métodos finales
    • En ocasiones interesa indicar que un determinado método no se puede redefinir  Método final
    • final public boolean menorQue (Figura f) {
    • return ( this.area() < f.area() );
    • }
      • Las clases derivadas NO pueden redefinir menorQue
        • Ojo: redefinir implica mantener la signatura del método.
    • Los métodos finales tienen ligadura estática (compilación).
  • 12. Clases finales
    • Se puede prohibir que una clase sea extendida declarándola como final.
    • final class Cuadrado extends Rectangulo
    • {
    • public Cuadrado (double lado) {
    • super (lado, lado);
    • }
    • public Cuadrado () {
    • super (10.0, 10.0);
    • }
    • }
      • No es posible definir una nueva clase que derive de Cuadrado
  • 13.
    • Concepto: Una clase puede derivarse de varias clases base.
    • Un EstudianteQueTrabaja es un Estudiante y
    • es un Empleado
    Herencia múltiple Herencia Simple Herencia Múltiple 2, 3, 4, ...
  • 14. Herencia múltiple: Conflictos (1)
  • 15. Herencia múltiple: Conflictos (2)
  • 16. Herencia múltiple
    • No siempre es problemática, pero se procura evitar, en la medida de los posible.
    • Hay lenguajes O.O. que directamente no la soportan:
      • Java , Smalltalk .
    • Otros lenguajes O.O. sí que la admiten:
      • C++ .
  • 17. Ejemplo Herencia Múltiple
  • 18. Interfaces
    • Una “interface” en Java es una colección de definiciones de métodos (sin implementación) y de valores constantes
    • Una interface es análogo a una clase abstracta con todos sus métodos abstractos y variables “finales y estáticas” con valor inicial.
    • Una clase A puede heredar de una sola clase (extends<<>>herencia simple) y puede “heredar” de varias interfaces (implements <<>>herencia múltiple).
    • Ambigüedades no permitidas en herencia de variables (en general Java no resuelve por sí mismo las ambigüedades en ningún caso)
    • Todas las interfaces descienden de “Object”
    • No se permiten ciclos en el grafo de clases e interfaces
  • 19. Interfaces en Java
    • ¿Cómo definir una interfaz?
    • [ public ] interface nombre_interfaz extends superinterfaces
    • {
    • cuerpo interfaz
    • }
    • - Si el modificador de acceso public no está presente,
    • la interfaz es sólo accesible en el paquete al cual pertenece
    • - El cuerpo de la interfaz puede incluir declaración de
    • constantes y de métodos (sin definición).
  • 20. Interfaces de JAVA - Una interfaz puede derivarse de varias interfaces. En este caso hereda todas las constantes y métodos de sus superinterfaces, excepto aquellos que ella redefina. }
  • 21. import java.util.*; // Interfaz IFecha: métodos y constantes para obtener el día, //mes y año public interface IFecha { public final static int DIA_DEL_MES = Calendar.DAY_OF_MONTH; public final static int MES_DEL_AÑO = Calendar.MONTH; public final static int AÑO = Calendar.YEAR; public abstract int día(); public abstract int mes(); public abstract int año(); } Ejemplo Interface Java
  • 22. public class CCuentaAhorro extends CCuenta implements IFecha { .... public void comisiones() { // Se aplican mensualm.por el mantenimiento de la cuenta if (día() == 1) reintegro(cuotaMantenimiento); } public double intereses() { if (día() != 1) return 0.0; // Acumular los intereses por mes sólo los días 1 de cada mes double intProducidos = 0.0; intProducidos= estado() * obtenerTipoDeInterés()/12; ingreso(intProducidos); // Devolver el interés mensual por si fuera necesario return interesesProducidos; }
  • 23. // Implementación de los métodos de la interfaz //IFecha public int dia() { GregorianCalendar fechaActual = new GregorianCalendar(); return fechaActual.get(DIA_DEL_MES); } public int mes() { return 0;} // no se necesita public int año() { return 0;} // no se necesita } Ejemplo Interface Java
  • 24.
    • Cada clase que implemente una interfaz, debe definir todos los métodos de ésta última.
    • Notar que el acceso a las constantes definidas en la interfaz es directo.
    • Si una clase implementa una interfaz, todas sus subclases heredan los métodos y constantes de aquella.
    Ejemplo Interface Java
  • 25. Jerarquía de Clases Clase Object Clase CCuenta Clase CcuentaCorriente Clase CcuentaCorrienteConIn Interfaz IFecha Clase CCuentaAhorro
  • 26. Clase abstracta vs interfaz ¿ Es equivalente una interfaz a una clase abstracta? Ejemplo: la interfaz IFecha ¿se podría definir como una clase abstracta? No, pues CCuentaAhorro y CCuentaCorriente ya tienen una superclase. Mas aún, la idea es que la interacción con GregorianCalendar no requiere establecer una relación de clases. Sólo se utiliza la interfaz para implementar uno o dos métodos específicos. Una interfaz es sólo un protocolo que implementa una clase cuando necesita usarlo.
  • 27. ¿Para qué se usa una interfaz? 1º Para captar similitudes entre clases no relacionadas, sin forzar una relación artificial. 2º Para declarar métodos que una o mas clases deben implementar en determinadas situaciones. 3º Publicar la interfaz de programación de una clase, sin descubrir como esta implementada.