Tengo una pregunta con respecto a cómo planeo crear mis modelos abstractos, estoy usando una clase abstracta como clase base y luego subclases, ¿está bien usarlo así?
Busqué en Google y encontré algunas muestras, pero ninguna era exactamente como lo estoy haciendo.
public abstract class Vehicle { String type; String color; public abstract getType(); public abstract setType(String type); public abstract String getColor(); public abstract setColor(String color); }Y luego en mis subclases, podría hacer algo como esto:
public class Truck extends Vehicle { String pickupBed; public setPickupBed(String pickupBed) { this.pickupBed = pickupBed; } public getPickupBed(String pickupBed) { return pickupBed; } public setType(String type) { this.type = type; } public getType(String type) { return type; } public setColor(String color) { this.color = color; } public getColor() { return color; } }Y otra clase, excepto los automóviles, no tiene camioneta.
public class Car extends Vehicle { public setType(String type) { this.type = type; } public getType(String type) { return type; } public setColor(String color) { this.color = color; } public getColor() { return color; } }Necesita crear getter y setter abstractos solo si necesita cambiar el comportamiento de getiin y configuración para sus variables. Si todas las clases secundarias usan la misma realización de getter y setter, debe crear getters y setters en la clase abstracta:
public abstract class Vehicle { protected String type; protected String color; public String getType(){ return type; }; public String setType(String type){ this.type = type; } ........ }En cualquier caso, si necesita incluir alguna lógica para setter/getter en el futuro, puede anular getter/setter existente:
public class Car extends Vehicle{ public setType(String type){ if (type.equals("type1")){ this.type = type + "_1"; } else { this.type = type + "_2"; } } public String getType(String type){ return "{" + this.type + "}"; } }Debe agregar métodos abstractos solo si desea forzar a class-child a implementar alguna lógica, por ejemplo:
public abstract class Vehicle { protected String type; protected String color; public String getType(){ return type; }; public String setType(String type){ this.type = type; } public String getTypeDescription(){ return "Type description: " + generateDescription(); } protected abstract String generateTypeDescription(); ........ } public class Car extends Vehicle{ String generateTypeDescription(){ return "bla...bla.."; } }Puede hacer todo lo que puede hacer en una clase abstracta en una clase normal, excepto crear un nuevo objeto solo mediante el uso de un constructor.
Esto significa que simplemente puede copiar y pegar los getters y setters de su subclase en su clase principal.
Dependiendo de sus objetivos de implementación e ideas de estilo, puede incluso hacer que estos captadores/establecedores sean finales , lo que significa que las subclases simplemente no pueden anularlos. Esto se vería así: public final String getType(){...} .
El getter y setter de su súper clase (Vehículo) no deberían ser abstractos. Las variables de la superclase deben ser privadas o públicas.