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 + " , " + 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 ("Circulo"); _radio = r; } public Circulo () { this (10.0); } public double area () { return ( PI * _radio * _radio ); } public void dibujar () { System.out.println ("Soy un Circulo de radio: " + _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 ("Rectangulo"); _base = ancho; _altura = alto; } public Rectangulo () { this (10.0, 10.0); } public double area () { return ( _base * _altura ); } public void dibujar () { System.out.println ("Soy un Rectangulo de: " + _base + "*" + _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 ("Area: " + fig[i].area()); System.out.println ("Dibujar:"); 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 ("La figura menor es:"); 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
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
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.