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
public abstract class Vehicle implements NewInterface{ protected double value; protected int capacity; protected int status; public Vehicle(){ this.patent = "Default"; this.brand = "Default"; this.model = "Default"; this.color = "Default"; this.capacity = 4; this.status = 0; this.value = 0.00; } this.patent = patent; this.brand = "Default"; this.model = "Default"; this.color = "Default"; this.capacity = 4; this.status = 0; this.value = 0.00; } this.patent = patent; this.brand = brand; this.model = model; this.color = color; this.capacity = capacity; this.status = 0; this.value = value; } // Setters y Getters [...] }
Ahora, a partir de esta clase podría tener la clase auto:
Código Java:
Ver original
public class Car extends Vehicle implements NewInterface{ public Car() { super(); } super(patent); } super(patent, brand, model, color, value, capacity); } @Override return "arrancamos el auto"; } }
y la interface donde declaro las acciones que pueden realizar los vehiculos, por ejemplo, prenderlo:
Código Java:
Ver original
public interface NewInterface { }
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
public final class Stock { private static Stock stock; private List<Vehicle> vehicles = new ArrayList<Vehicle>(); private Stock(){} public static Stock newInstance(){ if(stock == null){ stock = new Stock(); } return stock; } Vehicle vehicle = validateExistence(patent); if(vehicle != null){ vehicle.setStatus(1); // ACA LA SALIDA POR CONSOLA ES LA MISMA, SEA QUE IMPLEMENTE UNA INTERFACE O UN METODO ABSTRACTO return true; } return false; } }
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 ?