Я должен управлять сборами для клиентов. Я создал класс под названием Due. Он хранит взносы для двух типов клиентов X, Y. Все идет так.Должен ли я использовать наследование класса или нет?
public abstract class Due {
private CustomerType customerType; //can be either X or Y
protected DueType dueType;
private String dueId;
private BigDecimal dueAmount;
private Date dueDate;
public Due(CustomerType type) {
this.customerType = type;
}
//getters , setters goes here.
}
Также DueType различны для обоих X и Y. Таким образом, я сделал интерфейс с именем DueType и перечислений XDueType, YDueType реализует его.
public interface DueType {
}
public enum XDueType implements DueType {
A, B;
}
public enum YDueType implements DueType {
C, D;
}
И у меня есть два разных класса, каждый специально предназначенный для X и Y. Как это
public class XDue extends Due {
public XDue() {
super(CustomerType.X);
}
public XDueType getDueType() {
return (XDueType) this.dueType;
}
}
public class YDue extends Due {
public YDue() {
super(CustomerType.Y);
}
public YDueType getDueType() {
return (YDueType) this.dueType;
}
}
я должен сделать много операций на Due независимо от его типа (эти операции будут одинаковыми для XDue или YDue).
Мой вопрос: следует ли использовать наследование здесь, как указано выше, или нет. Я мог бы сделать только один класс Только. Это могло бы просто сделать работу для меня. Но первый метод кажется мне более семантически правильным. Также, в будущем XDue, YDue может стать менее похожим. Поэтому я считаю, что лучше отделить их отныне. Я прав?
Возможный дубликат (HTTP: // StackOverflow.com/questions/49002/prefer-composition-over-inheritance) – MaxG
Почему вы создали пустой интерфейс без абстрактных методов? – Logan
На это нельзя ответить без семантической информации о том, как отличаются XDue и YDue, как они? – IceFire