Foros del Web » Programación para mayores de 30 ;) » Java »

No termino de entender cuando aplicar interfaces y cuando no

Estas en el tema de No termino de entender cuando aplicar interfaces y cuando no en el foro de Java en Foros del Web. Hola, buenas a todos. Queria saber si me pueden explicar cuando es necesario aplicar una interface y cuando no, estuve haciendo unos ejercicios, pero lo ...
  #1 (permalink)  
Antiguo 21/03/2016, 14:57
 
Fecha de Ingreso: julio-2014
Mensajes: 79
Antigüedad: 9 años, 9 meses
Puntos: 1
No termino de entender cuando aplicar interfaces y cuando no

Hola, buenas a todos.
Queria saber si me pueden explicar cuando es necesario aplicar una interface y cuando no, estuve haciendo unos ejercicios, pero lo mismo que hago en la interface lo puedo hacer en una clase padre, por ejemplo:

Tengo una clase abstracta Vehiculo, donde agrego todos los atributos de un vehiculo en general:
Código Java:
Ver original
  1. public abstract class Vehicle implements NewInterface{
  2.    
  3.     protected String patent;
  4.     protected String brand;
  5.     protected String model;
  6.     protected String color;
  7.     protected double value;
  8.     protected int capacity;
  9.     protected int status;
  10.    
  11.     public Vehicle(){
  12.         this.patent   = "Default";
  13.         this.brand    = "Default";
  14.         this.model    = "Default";
  15.         this.color    = "Default";
  16.         this.capacity = 4;
  17.         this.status   = 0;
  18.         this.value    = 0.00;
  19.     }
  20.    
  21.     public Vehicle(String patent){
  22.         this.patent   = patent;
  23.         this.brand    = "Default";
  24.         this.model    = "Default";
  25.         this.color    = "Default";
  26.         this.capacity = 4;
  27.         this.status   = 0;
  28.         this.value    = 0.00;
  29.     }
  30.    
  31.     public Vehicle(String patent, String brand, String model, String color, double value, int capacity){
  32.         this.patent   = patent;
  33.         this.brand    = brand;
  34.         this.model    = model;
  35.         this.color    = color;
  36.         this.capacity = capacity;
  37.         this.status   = 0;
  38.         this.value    = value;
  39.     }
  40.  
  41.     // Setters y Getters
  42.     [...]
  43. }

Ahora, a partir de esta clase podría tener la clase auto:
Código Java:
Ver original
  1. public class Car extends Vehicle implements NewInterface{
  2.    
  3.     public Car() {
  4.         super();
  5.     }
  6.    
  7.     public Car(String patent) {
  8.         super(patent);
  9.     }
  10.    
  11.     public Car(String patent, String brand, String model, String color, double value, int capacity) {
  12.         super(patent, brand, model, color, value, capacity);
  13.     }
  14.  
  15.     @Override
  16.     public String turnOn() {
  17.         return "arrancamos el auto";
  18.     }
  19. }

y la interface donde declaro las acciones que pueden realizar los vehiculos, por ejemplo, prenderlo:
Código Java:
Ver original
  1. public interface NewInterface {
  2.     String turnOn();
  3. }

Pero yo tambien podria evitarme el hecho de crear la interface, y crear un método abstracto en la clase Vehicle que se llama turnOn y hacer la implementación de ese método en cada clase hija y el resultado es el mismo. Entonces, cuando hay que crear una clase y cuando una interface ? aun no entiendo eso

Para ver si el resultado de crear una interface o crear un metodo abstracto en la clase padre era el mismo, me cree una clase stock, donde al alquilar un auto lo prendo:

Código Java:
Ver original
  1. public final class Stock {
  2.    
  3.     private static Stock stock;
  4.     private List<Vehicle> vehicles = new ArrayList<Vehicle>();
  5.    
  6.     private Stock(){}
  7.    
  8.     public static Stock newInstance(){
  9.         if(stock == null){
  10.             stock = new Stock();
  11.         }
  12.        
  13.         return stock;
  14.     }
  15.    
  16.     public boolean rentVehicle(String patent){
  17.         Vehicle vehicle = validateExistence(patent);
  18.        
  19.         if(vehicle != null){
  20.             vehicle.setStatus(1);
  21.             // ACA LA SALIDA POR CONSOLA ES LA MISMA, SEA QUE IMPLEMENTE UNA INTERFACE O UN METODO ABSTRACTO
  22.             System.err.print(vehicle.turnOn());
  23.             return true;
  24.         }
  25.        
  26.         return false;
  27.     }
  28. }

y efectivamente la salida por consola era "arrancamos el auto" ya sea que implemente una interface o un método abstracto en la clase padre. Quizás la pregunta es muy tonta pero en verdad no entiendo porque o cuando usar uno u otro, alguno me podria dar una mano ?
  #2 (permalink)  
Antiguo 22/03/2016, 02:31
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años
Puntos: 306
Respuesta: No termino de entender cuando aplicar interfaces y cuando no

¿Y si necesitas que comparta características con dos clases distintas?¿Puedes heredar de dos clases (herencia múltiple)? No, la solución son las interfaces.

Una herencia implica la relación ES, por ejemplo Perro ES Animal, si yo quiero que dos clases compartan métodos pero no comparten relación ES la interface es la solución. En realidad siempre podrás darle tantas vueltas que encuentres una relación, si tu proyecto es sencillo no necesitarás interfaces y podrás inventar clases abstractas que hagan de interfaces, pero según sea más complejo las clases abstractas que te hayas inventado serán tan forzadas que tendrás problemas con la herencia múltiple
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 22/03/2016, 14:30
 
Fecha de Ingreso: julio-2014
Mensajes: 79
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: No termino de entender cuando aplicar interfaces y cuando no

Claro, ahora voy entendiendo.
Muchas veces no veo la utilidad de crear interfaces, pero es como vos decis, no veo esa utilidad porque estoy haciendo ejercicios muy básicos, tendré que encontrar alguna pagina donde tengan ejercicios mas completos y difíciles para poder entenderlo del todo.
Muchas gracias :D

Etiquetas: clase, entender, interfaces, string, termino
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:20.