En el siguiente ejercicio, vemos como el diseño de una interface y su posterior implementacion, nos facilita los tratamientos de objetos, sin necesidad de preocuparnos por sus detalles, cuando debemos acceder a las caracteristicas comunes.
Para ello, creamos un nuevo paquete, llamado «autos», y escribimos la interface que deberán implementar nuestras clases:
package autos; public interface Vehiculo { int VELOCIDAD_MAXIMA=120; String frenar(int cuanto); String acelerar(int cuanto); }
Ahora pasamos a escribir dos clases, la clase coche
package autos; public class Coche implements Vehiculo { int velocidad=0; @Override public String frenar(int cuanto) { // TODO Auto-generated method stub; velocidad-=cuanto; return "El coche ha frenado ya y va a "+velocidad+"km/hora"; } @Override public String acelerar(int cuanto) { // TODO Auto-generated method stub String cadena=""; velocidad+=cuanto; if (velocidad>VELOCIDAD_MAXIMA) cadena="Exceso de velocidad"; cadena+="El coche ha acelerado y va a "+velocidad+"km/hora"; return cadena; } public int plazas(){ return 4; }
y la clase moto
package autos; public class Moto implements Vehiculo { int velocidad; @Override public String frenar(int cuanto) { // TODO Auto-generated method stub velocidad-=cuanto; return "La moto ha frenado ya y va a "+velocidad+"km/hora"; } @Override public String acelerar(int cuanto) { // TODO Auto-generated method stub String cadena=""; velocidad+=cuanto; if (velocidad>VELOCIDAD_MAXIMA) cadena="Exceso de velocidad"; cadena+="La moto ha acelerado y va a "+velocidad+"km/hora"; return cadena; } public int plazas(){ return 2; } }
Ahora, creamos una clase accesible desde linea de comando, para probar estas dos clases y la llamamos UsoVehiculo
package autos; public class UsoVehiculo { /** * @param args */ static Vehiculo[] moviles; public static void main(String[] args) { // TODO Auto-generated method stub genera(); /* Vehiculo v1=new Moto(); Coche v2 = new Coche(); System.out.println(acelerar(100,v1)); System.out.println(v1.frenar(25)); System.out.println(acelerar(130,v2)); System.out.println(v2.frenar(25));*/ } static void destruyeVehiculo(Vehiculo val){ System.out.println("Envio a desguace "+ val.toString()); } static String acelerar(int cantidad,Vehiculo vei){ return vei.acelerar(cantidad); } public static void genera(){ moviles=new Vehiculo[6]; moviles[0]=new Moto(); moviles[1]=new Coche(); moviles[2]=new Moto(); moviles[3]=new Moto(); moviles[4]=new Coche(); moviles[5]=new Moto(); for (int a=1;a<10;a++){ avanza(); } } public static void avanza(){ System.out.println("Avanzando"); for (int a=0;a
Si observais, hemos creado un array, del tipo Vehiculo, en donde nos aparecen mezclados coches y motos; sin el uso de la Interface, no hubiera sido posible, de una forma sencilla, la definicion de un array que contuviera los dos tipos (distintos) de objetos. A traves de este array, podemos acceder a los metodos especificados en la interface; naturalmente, si la clase ha añadido algun metodo por su cuenta no lo podremos ver, pero esta capacidad de meternos en un bucle para revisar nuestros objetos ya es bastante util.
Si necesitaramos acceder a otros metodos o propiedades especiales de una clase, podemos averiguar cual es la clase a la que pertenece realmente ese objeto, utilizando un método de object (getClass()), podeis probar de añadir en el ultimo bucle
System.out.println(moviles[a].getClass());
si sabes la clase, puedes hacer un cast y listo
24 comentarios
Hola como están, solo para comentar que el ultimo metodo avanza, esta incompleto y no se ve que es lo que va hacer, si lo pueden completar seria de gran ayuda, de antemano gracias .
!! un saludo !!
Dejando aparte que solo se intenta dar ideas….dime exactamente lo que hechas en falta, y mirare de solucionarlo
Hola como están, solo para comentar que el ultimo metodo avanza, esta incompleto y no se ve que es lo que va hacer, si lo pueden completar seria de gran ayuda, de antemano gracias .
!! un saludo !!
Hola muy buen ejercicio, acabo de aprender de el. Pero porque recomiendas hacer un cast al final?, me perdí en esa parte, podrias explicarme por favor
Tenemos un objeto, pero si quieres utilizarlo como tal, le debes hacer un cast a la clase que pertenece, para poder utilizar todos sus métodos…..