Как создать обертку двух разных классов с одинаковыми полями?

206
09 июня 2018, 10:00

Пишу окно, в котором постоянно должны двигаться круги\квадраты. Показываются только круги\квадраты, но в этом время другие фигуры двигаются.

(вот гит с исходником: https://github.com/Kaper156/MovingFigures)

Я решил дополнить классы стандартных фигур (MovingCircle, MovingSquare) и реализовать в них направление и расчет следующей точки (а также изменение направления при столкновении).

Проблема в следующем: мне пришлось написать два практически идентичных класса (MovingCircle, MovingSquare), которые дополняют Ellipse2d.Double и Rectangle2d.Double соответственно. Как сделать общий для этих двух классов "передвигатель"? Ведь нужные мне координаты и размеры доступны только в последней реализации.

public class MovingSquare extends Rectangle2D.Double implements MovingFigure {
    private float angle;
    public Color color;
    MovingSquare() {
        Random r = new Random();
        this.width = this.height = r.nextInt(20) + 5;
        this.angle = r.nextFloat() * 360;
        this.x = width * 3 + r.nextDouble() * (CANVAS_W - width * 6);
        this.y = height * 3 + r.nextDouble() * (CANVAS_H - height * 6);
        this.color = new Color(r.nextFloat(), r.nextFloat(), r.nextFloat());
    }
    public void MoveSelf() {
        x = x + Math.cos(angle * Math.PI / 180) * SPEED;
        y = y + Math.sin(angle * Math.PI / 180) * SPEED;
        if (x <= this.width || x >= CANVAS_W - width * 2) {
            angle = 180 - angle;
        }
        if (y <= this.height || y >= CANVAS_H - height * 2) {
            angle = 360 - angle;
        }
    }
}
public class MovingCircle extends Ellipse2D.Double implements MovingFigure {
    private float angle;
    public Color color;
    MovingCircle() {
        Random r = new Random();
        this.width = this.height = r.nextInt(20) + 5;
        this.angle = r.nextFloat() * 360;
        this.x = width * 3 + r.nextDouble() * (CANVAS_W - width * 6);
        this.y = height * 3 + r.nextDouble() * (CANVAS_H - height * 6);
        this.color = new Color(r.nextFloat(), r.nextFloat(), r.nextFloat());
    }
    public void MoveSelf() {
        x = x + Math.cos(angle * Math.PI / 180) * SPEED;
        y = y + Math.sin(angle * Math.PI / 180) * SPEED;
        //TODO radius
        if (x <= this.width || x >= CANVAS_W - width * 2) {
            angle = 180 - angle;
        }
        if (y <= this.height || y >= CANVAS_H - height * 2) {
            angle = 360 - angle;
        }
    }
}
Answer 1

Я бы взглянул в торону генериков бы, и определил базовый класс, с указанием фигуры в виде параметра генерика.

READ ALSO
Ошибка при старте сервера jboss &ldquo;Could not make local copy for file&hellip;&rdquo;

Ошибка при старте сервера jboss “Could not make local copy for file…”

При запуске сервера jBoss вылетает ошибка:

158
Server on node.js + android client + json file

Server on node.js + android client + json file

Есть RESTful API на Nodejs который работает с json файлом

162
Распределенная транзакция jta в spring boot

Распределенная транзакция jta в spring boot

Как нужно настроить менеджер транзакций JtaTransactionManager, чтобы делать распределенные транзакции в разные БД? Ниже привожу полоную конфигурацию,...

205
inline-block с max-width переносится на новую строку

inline-block с max-width переносится на новую строку

Есть два inline-block расположенные горизонтальноУ одго - ширина фиксированная, у другого - задана max-width

220