https://www.javatpoint.com/interface-in-java
https://javadesdecero.es/intermedio/interfaces-ejemplos/
Vamos a usar la clase que hemos hecho dentro de un programa.
El programa nos va a decir lo siguiente:
Bienvenido al simulador. Vamos a crear un ejército
¿Cuantos soldados quieres?
¿Cuantos lanceros quieres?
¿Cuantos capitanes quieres?Creado el ejército con N soldados, N lanceros y N capitanes. El daño total de tu ejército es: Daño
¿Qué quieres hacer?
1- Atacar
2.- Retirada
0.- SalirHas decidido ATACAR
1.- Adelante con todas las unidades
2.- Atacar con una sóla unidad
0.- Salir¿Con qué unidad quieres atacar?
Has atacado con la unidad X que es un YY y has causado D dañoHas decidido RETIRADA
1.- Retirar todas las unidades
2.- Retirar una sóla unidad
0.- Salir¿Qué unidad quieres retirar?
Has retirado la unidad XX que ahora causa D de daño
Vamos a modificar la clase Lancero y añadir un método ‘ataqueLanza’ void, sin parámetros y que simplemente nos muestra ‘Ataque con lanza’+danyo.
Una vez hecho esto en nuestro método ‘aLaCarga’ si la unidad es un Lancero, además de llamar a ‘carga’ llamamos a ‘ataqueLanza’
Vamos a modificar ‘aLaCarga’ y si una unidad tiene danyo 0 o menor que no ataque.
Vamos a comprobar en fortaleza y danyo que no puedan tener valores negativos.
Vamos a modificar el constructor de Ejército para que le pasemos el número de soldados, lanceros y capitanes. Haremos una sobrecarga: Si no nos pasan parámetros, como antes. Si nos pasan los parámetros ej: new Ejercito(3,2,1)-> Creará 3 soldados, 2 lanceros y 1 Capitan.
package com.trifulcas.ejercitos;
abstract public class Enemigo {
private String nombre;
private int fortaleza;
private int danyo;
/**
* @param nombre the nombre to set
*/
protected void setNombre(String nombre) {
this.nombre = nombre;
}
/**
* @param fortaleza the fortaleza to set
*/
protected void setFortaleza(int fortaleza) {
this.fortaleza = fortaleza;
}
/**
* @param danyo the danyo to set
*/
protected void setDanyo(int danyo) {
if (danyo >= 0) {
this.danyo = danyo;
}
}
/**
* @return the nombre
*/
public String getNombre() {
return nombre;
}
/**
* @return the fortaleza
*/
public int getFortaleza() {
return fortaleza;
}
/**
* @return the danyo
*/
public int getDanyo() {
return danyo;
}
public Enemigo() {
// TODO Auto-generated constructor stub
}
}
package com.trifulcas.ejercitos;
abstract public class Infanteria extends Enemigo {
private int armadura;
/**
* @param armadura the armadura to set
*/
protected void setArmadura(int armadura) {
this.armadura = armadura;
}
public Infanteria() {
// TODO Auto-generated constructor stub
}
abstract void cargar();
abstract void retroceder();
}
package com.trifulcas.ejercitos;
abstract public class Caballeria extends Enemigo {
private int velocidad;
public Caballeria() {
// TODO Auto-generated constructor stub
}
}
package com.trifulcas.ejercitos;
abstract public class Arqueros extends Enemigo {
private int distancia;
public Arqueros() {
// TODO Auto-generated constructor stub
}
}
package com.trifulcas.ejercitos;
public class Soldado extends Infanteria {
public Soldado() {
setNombre("Soldado");
setFortaleza(50);
setDanyo(5);
setArmadura(20);
}
@Override
public void cargar() {
System.out.println("Ataque de soldados "+getDanyo());
}
@Override
public void retroceder() {
System.out.println("¡¡Retirada!!!!");
setFortaleza(getFortaleza()-5);
setDanyo(getDanyo()-1);
}
}
package com.trifulcas.ejercitos;
public class Lancero extends Infanteria {
public Lancero() {
setNombre("Lancero");
setFortaleza(60);
setDanyo(15);
setArmadura(10);
}
@Override
public void cargar() {
System.out.println("Ataque de lanceros "+getDanyo());
}
@Override
public void retroceder() {
System.out.println("¡¡Retirada!!!!");
setFortaleza(getFortaleza()-4);
setDanyo(getDanyo()-2);
}
}
package com.trifulcas.ejercitos;
public class Capitan extends Infanteria {
public Capitan() {
setNombre("Capitán");
setFortaleza(70);
setDanyo(10);
setArmadura(40);
}
@Override
public void cargar() {
System.out.println("Ataque de capitán "+getDanyo());
}
@Override
public void retroceder() {
System.out.println("¡¡Retirada!!!!");
setFortaleza(getFortaleza()-5);
setDanyo(getDanyo()-2);
}
}
package com.trifulcas.ejercitos;
public class Ejercito {
Infanteria[] infanteria;
public Ejercito() {
infanteria=new Infanteria[15];
for(int i=0;i<10;i++) {
infanteria[i]=new Soldado();
}
for(int i=10;i<14;i++) {
infanteria[i]=new Lancero();
}
infanteria[14]=new Capitan();
}
}
Vamos a crear una clase ‘Ejercito’ que, de momento, va a tener como propiedad un array de Infanteria
En el constructor vamos a crear, en ese array, 10 soldados, 4 lanceros y 1 capitan.
Vamos a crear un método totalDanyo que nos devuelva el daño total de todas nuestras unidades.
Vamos a crear un método aLaCarga que activa el método cargar de todas nuestras unidades y nos muestre el daño total
Vamos a crear un método retirada que activa el método retirada de todas nuestras unidades.
Para probarlo en el main creamos un ejército y ejecutamos alguna vez los métodos a ver si hacen lo que tienen que hacer.
En la clase Infanteria vamos a poner los siguientes métodos ABSTRACTOS:
void cargar()
void retroceder()
De la clase Infanteria vamos a derivar las siguientes clases que no son abstractas.
Soldado
Tiene un constructor sin parámetros. En el nombre vamos a poner ‘Soldado’ en fortaleza 50, en danyo 5 y en armadura 20.
En el método cargar pondremos un mensaje que ponga ‘Ataque de soldados ‘+ lo que tenga en la popiedad danyo
En el método retroceder que escriba ‘Retirada!!!!’ y que disminuya 5 a la fortaleza y 1 al danyo.
Lancero
Tiene un constructor sin parámetros. En el nombre vamos a poner ‘Lancero’ en fortaleza 60, en danyo 15 y en armadura 10.
En el método cargar pondremos un mensaje que ponga ‘Ataque de lanceros’+ lo que tenga en la popiedad danyo
En el método retroceder que escriba ‘Retirada!!!!’ y que disminuya 4 a la fortaleza y 2 al danyo.
Capitan
Tiene un constructor sin parámetros. En el nombre vamos a poner ‘Capitan’ en fortaleza 70, en danyo 10 y en armadura 40.
En el método cargar pondremos un mensaje que ponga ‘Ataque de soldados ‘+ lo que tenga en la popiedad danyo
En el método retroceder que escriba ‘Retirada!!!!’ y que disminuya 5 a la fortaleza y 2 al danyo.
Vamos a crear unas clases para almacenar información de un juego.
Crearemos la clase ‘Enemigo’ con las siguientes propiedades:
String nombre
int fortaleza
int danyo
Todas privadas y con getters pero no con setters.
De ahí vamos a derivar las siguientes clases: ‘Infanteria’ ‘Caballeria’ ‘Arqueros’
Infanteria tendrá la propiedad:
int armadura
Caballeria tendrá la propiedad:
int velocidad
Arqueros tendrá la propiedad:
int distancia.
Todas las clases son ABSTRACTAS.
package com.trifulcas.clases;
abstract public class Repaso {
private String nombre;
public void saludo() {
System.out.println("Hola");
}
// Método abstracto: contrato de obligación de implementar
abstract public void despedida();
}
class RepasoExt extends Repaso{
public void tonteria() {
System.out.println("Probando");
}
public void despedida() {
System.out.println("Adios");
}
}
class RepasoExt2 extends Repaso{
public void otraTonteria() {
System.out.println("Buuu");
}
@Override
public void despedida() {
System.out.println("Chao");
}
}
Uso:
package com.trifulcas.clases;
public class ProbarClases {
public static void main(String[] args) {
RepasoExt r = new RepasoExt();
RepasoExt2 r2 = new RepasoExt2();
// Esto da error porque es una clase abstracta
// Y no se pueden instanciar
// Repaso r3=new Repaso();
r.saludo();
r.tonteria();
r.despedida();
r2.saludo();
r2.otraTonteria();
r2.despedida();
System.out.println("----------");
Repaso[] lista= {new RepasoExt(),new RepasoExt2(),new RepasoExt()};
for(Repaso el:lista) {
el.despedida();
}
}
}
package com.trifulcas.clases;
public class Repaso {
private String nombre;
// COnstructor se invoca cuando instanciamos la clase
// Ej. Repaso foo=new Repaso("pepe")
public Repaso(String nombre) {
this.nombre = nombre;
}
private void saludo() {
System.out.println("Hola me llamo " + nombre);
}
private void despedida() {
System.out.println("Chao pescao");
}
public void holayAdios() {
saludo();
despedida();
}
/**
* @return the nombre
*/
public String getNombre() {
return nombre;
}
/**
* @param nombre the nombre to set
*/
public void setNombre(String nombre) {
if (nombre.length() >= 4) {
this.nombre = nombre;
}
}
}
class RepasoExtendida extends Repaso {
private int veces;
public RepasoExtendida(String nombre) {
// super llama a la clase madre, en este caso al constructor
super(nombre);
veces = 4;
}
// Sobreescribo el método holayAdios
public void holayAdios() {
for (int i = 0; i < veces; i++) {
// LLamo a la función holaYAdios de la clase madre
super.holayAdios();
}
}
}
class RepasoExtendida2 extends Repaso {
private int veces;
public RepasoExtendida2(String nombre) {
// super llama a la clase madre, en este caso al constructor
super(nombre);
veces = 4;
}
// Sobreescribo el método holayAdios
public void holayAdios() {
System.out.println("Soy la 2 y digo hola");
}
}
class RepasoExtendida3 extends Repaso {
private int veces;
public RepasoExtendida3(String nombre) {
// super llama a la clase madre, en este caso al constructor
super(nombre);
veces = 4;
}
// Sobreescribo el método holayAdios
public void holayAdios() {
System.out.println("Hola y adios");
}
}
Uso:
package com.trifulcas.clases;
public class Repaso {
private String nombre;
// COnstructor se invoca cuando instanciamos la clase
// Ej. Repaso foo=new Repaso("pepe")
public Repaso(String nombre) {
this.nombre = nombre;
}
private void saludo() {
System.out.println("Hola me llamo " + nombre);
}
private void despedida() {
System.out.println("Chao pescao");
}
public void holayAdios() {
saludo();
despedida();
}
/**
* @return the nombre
*/
public String getNombre() {
return nombre;
}
/**
* @param nombre the nombre to set
*/
public void setNombre(String nombre) {
if (nombre.length() >= 4) {
this.nombre = nombre;
}
}
}
class RepasoExtendida extends Repaso {
private int veces;
public RepasoExtendida(String nombre) {
// super llama a la clase madre, en este caso al constructor
super(nombre);
veces = 4;
}
// Sobreescribo el método holayAdios
public void holayAdios() {
for (int i = 0; i < veces; i++) {
// LLamo a la función holaYAdios de la clase madre
super.holayAdios();
}
}
}
class RepasoExtendida2 extends Repaso {
private int veces;
public RepasoExtendida2(String nombre) {
// super llama a la clase madre, en este caso al constructor
super(nombre);
veces = 4;
}
// Sobreescribo el método holayAdios
public void holayAdios() {
System.out.println("Soy la 2 y digo hola");
}
}
class RepasoExtendida3 extends Repaso {
private int veces;
public RepasoExtendida3(String nombre) {
// super llama a la clase madre, en este caso al constructor
super(nombre);
veces = 4;
}
// Sobreescribo el método holayAdios
public void holayAdios() {
System.out.println("Hola y adios");
}
}
package com.trifulcas.clases;
// Una clase abstracta no se puede instanciar
// Puede tener propiedades y métodos no abstractos
// Puede tener métodos abstractos
abstract public class Figura {
private String nombre;
/**
* @param nombre the nombre to set
*/
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getNombre() {
return nombre;
}
// Puede tener métodos abstractos
// Un contrato para que las clases derivadas implementen el método
// Los métodos abstractos no incorporan código
abstract public double area();
}
class Cuadrado extends Figura{
private int lado;
public Cuadrado(int lado) {
super();
this.lado = lado;
setNombre("cuadrado");
}
@Override
public double area() {
return lado*lado;
}
}
class Circulo extends Figura{
private int radio;
public Circulo(int radio) {
super();
this.radio = radio;
setNombre("círculo");
}
@Override
public double area() {
return Math.PI*radio*radio;
}
}
Uso:
Figura[] ejercicios= {new Cuadrado(2),new Circulo(3),new Cuadrado(4)};
for(Figura f:ejercicios) {
System.out.println(f.getNombre()+" | "+f.area());
}