Clase abstracta:
package com.trifulcas.clases; // Clase abstracta. Es una clase que puede tener de todo como un clase normal // Pero no puede ser instanciada // Con frecuencia las clases abstractas incorporan métodos abstractos abstract public class Animal { String nombre; // Esto es un método abstracto // Significa que sólo definimos parámetros de entrada y salida // No especificamos funcionalidad en código // Obligar a todas las clases derivadas a implementar este método abstract void sonido(); // Esto es un método normal y corriente public void saludo() { System.out.println("Me llamo "+nombre); } } class Perro extends Animal{ public void sonido() { System.out.println("Guau"); } public void aullido() { System.out.println("Auuuuuu"); } } class Gato extends Animal{ public void sonido() { System.out.println("Miau"); } public void ronroneo() { System.out.println("Rrrrrr"); } } class Pato extends Animal{ public void sonido() { System.out.println("CuaCua"); } } class Ornitorrinco extends Animal{ public void sonido() { System.out.println("Bidiji"); } } class Caballo extends Animal{ @Override public void sonido() { System.out.println("Brrr"); } }
Interfaces:
package com.trifulcas.clases; // Definiendo un interface con un método interface Audio { // Este método es como un método abstracto de una clase abstracta // Las clases que implementen este interfaz deben implementar el método void sonido(); } interface Movimiento{ void acelerar(); void frenar(); } class Automovil implements Audio,Movimiento { @Override public void sonido() { System.out.println("brum brum"); } @Override public void acelerar() { // TODO Auto-generated method stub } @Override public void frenar() { // TODO Auto-generated method stub } } class Monociclo implements Audio { @Override public void sonido() { System.out.println("Dring dring"); } } class Avion implements Audio{ @Override public void sonido() { // TODO Auto-generated method stub } }
package com.trifulcas.clases; public class Instrumento implements Audio { public Instrumento() { // TODO Auto-generated constructor stub } @Override public void sonido() { System.out.println("Tarán"); } }
Un interfaz suelto con herencia:
package com.trifulcas.clases; public interface Financiero { // Métodos que se tienen que implementar en aquellas clases // que implementen este interfaz // Y con los mismos parámetros de entrada y salida double interes(); double irpf(int importe); } interface Bolsa extends Financiero{ void compra(); }
Clases que implementan ese interfaz:
package com.trifulcas.clases; // Al implementar 'Financiero' estoy obligado a definir los métodos // incluídos en el interfaz: interes e irpf public class Banco implements Financiero { private int saldo; public Banco() { saldo = 9000; } @Override public double interes() { if (saldo < 500) { return 0.5; } else { return 0.3; } } @Override public double irpf(int importe) { return 0.12; } }
package com.trifulcas.clases; // Lo mismo que en Banco. Pero 'Sueldo' y 'Banco' son dos clases que // no están relacionadas por herencia public class Sueldo implements Financiero { public Sueldo() { // TODO Auto-generated constructor stub } @Override public double interes() { // TODO Auto-generated method stub return 0; } @Override public double irpf(int importe) { // TODO Auto-generated method stub return 0.15; } }
package com.trifulcas.clases; abstract public class Broker implements Bolsa { public Broker() { } abstract void comision(); } // Esta clase hereda: // 1.- El contrato de el método abstracto comision de su clase madre // 2.- El contrato del interfaz Bolsa que ha adquirido la madre // 3.- El contrato del interfaz Financiero que ha adquirido Bolsa por extenderlo class WallStreet extends Broker{ @Override public void compra() { // TODO Auto-generated method stub } @Override public double interes() { // TODO Auto-generated method stub return 0; } @Override public double irpf(int importe) { // TODO Auto-generated method stub return 0; } @Override void comision() { // TODO Auto-generated method stub } }
Uso en el programa:
package com.trifulcas.clases; import com.trifulcas.ejercitos.Ejercito; public class ProbarClases { public static void main(String[] args) { Animal[] granja= {new Perro(),new Gato(),new Pato()}; Audio[] parque= {new Automovil(), new Monociclo(),new Instrumento()}; Financiero[] empresa= {new Banco(),new Sueldo(),new Banco()}; Perro p=new Perro(); for(Financiero f:empresa) { System.out.println(f.interes()); } Banco b=new Banco(); Sueldo s=new Sueldo(); System.out.println(importe(b,1000)); System.out.println(importe(s,2000)); Movimiento miCarro=new Automovil(); for(Animal animal:granja) { animal.sonido(); } for(Audio vehiculo:parque) { vehiculo.sonido(); } Automovil auto=new Automovil(); Instrumento violin=new Instrumento(); repetir(auto,3); repetir(violin,8); } // El parámetro 'elemento' debe ser de una clase que implemente el // interfaz 'Financiero' obligatoriamente yo sé que ese parámetro // tendrá definidos los métodos 'interes' y 'irpf' public static double importe(Financiero elemento, double importe) { return elemento.interes()*importe; } public static void repetir(Audio elemento, int veces) { for(int i=0;i<veces;i++) { elemento.sonido(); } } }