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();
}
}
}