我正在研究一个组件,该组件应该:
大约有十种类型的项目。我使用继承来建模项目。我有一个具有共同属性和计算的基类,以及实现类型特定问题的子类。与以下示例类似:
public abstract class BaseItem {
String name;
boolean valid = true;
public void postCalucate() {
//common calculation
valid = valid && (name != null);
}
}
public class ItemA extends BaseItem {
BigDecimal value;
@Override
public void postCalucate() {
//some A specific calculations
super.postCalucate();
}
}
public class ItemA1 extends ItemA {
BigDecimal extraValue;
@Override
public void postCalucate() {
//some A1 subtype specific calculations
valid = isA1ItemValid();
super.postCalucate();
}
}
public class ItemB extends BaseItem {
Integer size;
@Override
public void postCalucate() {
//some B specific calculations
super.postCalucate();
}
}
有没有更好的方法/样式来完成我的任务?有什么建议吗?
最佳答案
您尝试使用的模式相当合理。通常,我可能建议使用接口而不是BaseItem
类,因为它可能不包含那么多通用功能。
通常,大多数人似乎建议为类定义接口。如果绝对要在AbstractClass中共享通用代码,我建议使用实现该接口的类,因为这种模式将来会使其具有更大的可扩展性和灵活性。
因此,您首先要定义适合您的项目。对我来说,在您的用例中,一个Item似乎是三件事:第一,它必须定义将在所有Item上调用的postCalculate()
方法。其次,它必须提供isValid()
方法。第三,它还应该提供getName()
方法。
public interface Item {
void postCalucate();
boolean isValid();
String getName();
}
然后,您将开始实现Abstract类。仅在确实需要在所有项目之间共享代码库时才执行此操作。
public abstract class BaseItem implements Item {
String name;
boolean valid = true;
public void postCalucate() {
//common calculation
valid = valid && (name != null);
}
public boolean isValid() {
return valid;
}
public String getName() {
return name;
}
}
如果BaseItem.postCalculate()是所有项目都需要完成的工作,则这是一种很好的方法。如果您不确定,则最好在
Helper
或Tool
类的某个地方定义一个方法,该方法执行项目的通用计算,并由postCalculate()
方法调用:public class ItemTools {
public static boolean meetsRequirements(Item item) {
return item.isValid && item.getName() != null;
}
}
许多人认为,这会给您带来更轻松的时间,因为您对
BaseItem
的要求可能会随着时间而变化。无论您走哪条路线,现在都只需要定义实际的项目即可:
public class ItemA extends BaseItem {
BigDecimal value;
@Override
public void postCalucate() {
//some A specific calculations
super.postCalucate();
}
}