【发布时间】:2018-11-16 13:07:59
【问题描述】:
假设我有一个具有不同Scenes 的应用程序。每个场景都有一个由多个ScreenElements 构建的布局,例如,将绘制到Canvas 的矩形框。对于某些Scenes,将使用相同的框。因此,鉴于DRY,我想使用继承。
我想要做的是将ScreenElements 存储在HashMap(或最终是EnumMap)中,以便我可以在代码中的其他位置调用ScreenElements 来更改它们的属性。
这是我现在想出的……
这是基本布局:
Public class BasicLayout {
private HashMap<String, ScreenElement> screenElements;
public BasicLayout() {
screenElements = new HashMap<>();
screenElements.put("BACKGROUND", new ScreenElement(...));
screenElements.put("BOXONE", new ScreenElement(...));
screenElements.put("BOXTWO", new ScreenElement(...));
}
public HashMap<String, ScreenElement> getScreenElements() {
return screenElements;
}
public ScreenElement getScreenElement(String elementName) {
return screenElements.get(elementName);
}
public void draw(Canvas canvas) {
for (ScreenElement screenElement: screenElements) {
screenElement.draw(canvas);
}
}
}
那么另一个布局可能是这样的:
Public class OtherLayout extends BasicLayout {
private HashMap<String, ScreenElement> screenElements;
public OtherLayout() {
screenElements = new HashMap<>(super.getScreenElements);
screenElements.put("BOXTHREE", new ScreenElement(...));
screenElements.put("BOXFOUR", new ScreenElement(...));
}
@Override
public HashMap<String, ScreenElement> getScreenElements() {
return screenElements;
}
@Override
public ScreenElement getScreenElement(String elementName) {
return screenElements.get(elementName);
}
@Override
public void draw(Canvas canvas) {
for (ScreenElement screenElement: screenElements) {
screenElement.draw(canvas);
}
}
所以问题是通过解决代码重复(我不再需要在我的OtherLayout 中添加BACKGROUND、BOXONE 和BOXTWO),我引入了代码重复!
我现在需要复制getScreenElements、getScreenElement 和draw 方法。在这种情况下,您需要覆盖它们,因为如果您不这样做,例如,getScreenElements 总是返回背景、BOXONE 和 BOXTWO,即使您实际上需要背景、BOXONE、BOXTWO、BOXTHREE 和 BOXFOUR(例如在Scene 使用 `OtherLayout'。
希望这是有道理的,并且有人有一个巧妙的解决方案!
澄清一下:
- 在任何时候
BasicLayout都应该有背景、BOXONE 和 BOXTWO - 在任何时候
OtherLayout应该有背景,BOXONE,BOXTWO, BOXTHREE 和 BOXFOUR。
【问题讨论】:
标签: java android inheritance dry