Предположим, у меня есть приложение с другим Scenes
.Каждая сцена имеет макет, который состоит из ряда ScreenElement
с, например, прямоугольных прямоугольников, которые будут нарисованы в Canvas
.Для некоторых Scenes
будут использоваться те же поля.Поэтому, ввиду DRY, я хочу использовать наследование.
Я хочу сохранить ScreenElement
в HashMap
(или, в конечном итоге, EnumMap
), чтобы я мог вызватьна ScreenElement
s в другом месте моего кода, чтобы изменить их атрибуты.
Вот то, что я придумал сейчас ...
Вот базовый макет:
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);
}
}
Так что дело в том, что, решая дублирование кода (мне больше не нужно добавлять BACKGROUND, BOXONE и BOXTWO в мои OtherLayout
)Я ввожу дублирование кода!
Теперь мне нужно продублировать методы getScreenElements
, getScreenElement
и draw
.В этом случае вам необходимо переопределить их, потому что, если вы этого не сделаете, getScreenElements
, например, всегда возвращайте BACKGROUND, BOXONE и BOXTWO, даже если вы действительно хотите BACKGROUND, BOXONE, BOXTWO, BOXTHREE и BOXFOUR (например, вScene
, который использует `OtherLayout '.
Надеюсь, что это имеет смысл, и у кого-то есть оригинальное решение!
Чтобы уточнить:
- В любое время
BasicLayout
должен иметь BACKGROUND, BOXONE и BOXTWO - В любое время
OtherLayout
должен иметь BACKGROUND, BOXONE, BOXTWO, BOXTHREE и BOXFOUR.