Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/03/2016, 14:57
RSmith
 
Fecha de Ingreso: julio-2014
Mensajes: 79
Antigüedad: 10 años, 3 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 ?