Это идиоматическая Java?

Потерпите меня ... Я не думаю, что это слишком субъективно, но, возможно, я ошибаюсь.

Недавно я хотел исключить повторяющийся код, который рисовал пользовательский фон Bitmap на нашем Приложение BlackBerry.

(На самом деле этот вопрос не касается BlackBerry, поэтому я предоставлю здесь некоторые подробности о графическом интерфейсе пользователя BB, чтобы люди, не являющиеся разработчиками Java, могли весить ...)

Класс FullScreen взят из BB API - у него есть метод paint (Graphics), который фреймворк вызывает для рисования экрана и любых добавленных к нему компонентов. Можно переопределить это, чтобы сделать пользовательское рисование - например, рисование фона Bitmap до того, как произойдет какое-либо другое рисование (новые API BB предоставляют класс Background, но наше приложение должно работать на старых телефонах).

Я хотел иметь несколько экранов все с одинаковым фоном, каждый из которых произвел какую-то особую раскраску ... вот что я придумал:

abstract public class BGFullScreen extends FullScreen {
    Bitmap bg;

    public BGFullScreen(Manager mgr, long style) {
        super(mgr, style);
        bg = Bitmap.getBitmapResource("bg.jpg");
    }

    abstract protected void innerPaint(Graphics g);

    protected void paint(Graphics g) {
        g.drawBitmap(new XYRect(0, 0, bg.getWidth(), bg.getHeight()), bg, 0, 0);

        innerPaint(g);

        super.paint(g);
    }
}

Каждый экран будет затем создавать подклассы этого абстрактного класса и реализовывать innerPaint (). Таким образом, когда инфраструктура BB вызывает метод paint (), каждый экран может иметь настраиваемое рисование ПОСЛЕ отрисовки фона (так что любое рисование происходит поверх фона), но ДО отрисовки компонентов экрана, когда FullScreen. paint () вызывается.

(Я придумал это, потому что изучал Common Lisp дома, и мне пришло в голову, что я хотел сделать что-то вроде комбинации чередующихся методов в CLOS)

Вот пример реализации абстрактного класса выше:

public class MainAppScreen extends BGFullScreen {

    public MainAppScreen() {
        super(new VerticalFieldManager(), 0);
        // add some components to the screen:
        add(new ButtonField(...));
        add(...)
    }

    protected void innerPaint(Graphics g) {
        // stuff drawn will be on top of background and under buttons 
        g.draw(...)
    }
}

В основном я хочу, чтобы дочерний класс реализовал метод, вызываемый в -между родительской реализацией и реализацией одного и того же метода его прародителем. Я не мог придумать другого способа сделать это в Java ...

Это идоматическая Java? Это действительно распространенный вопрос, и это глупый вопрос? Это действительно ужасный дизайн? (Эксперты BB, как я могу сделать это по-другому?)

Отредактировано для добавления: Это работает, как описано - рисование происходит в том порядке, в котором я хочу.

5
задан Cœur 5 March 2019 в 15:48
поделиться