Объединение массивов разных типов объектов в один - PullRequest
0 голосов
/ 21 мая 2019

У меня есть несколько массивов, которые содержат объекты (для программы, подобной рисованию), основанные на конструкторе в классе, и я хочу поместить их все в один и тот же массив, а не каждый элемент перерисовывать по порядку.

iveпопытался превратить массив в 2d массив (безуспешно), а также попытался прикрепить идентификатор к каждому объекту и распечатать на консоли то, что я получаю из базового массива, который package1.package2.ShapeClas@<string of letters and numbers> неудачно получает возвраты, с которыми я могу делать все что угодно.

Рассматриваемые массивы, которые я хочу объединить, аналогичны приведенным ниже

public static ArrayList<ShapeClass> emptyRectangle = new ArrayList<ShapeClass>();
public static ArrayList<ShapeClass> filledRectangles = new ArrayList<ShapeClass>();
public static ArrayList<ShapeClass> lineArray = new ArrayList<ShapeClass>();

С каждым массивом, заполняемым объектами, созданными по линиям (с несколькими другими полезными вещами, которые могут поделиться, если этоне достаточно), масштаб форм меняется в зависимости от размера окон при масштабировании

for (ShapeClass cr : emptyRectangle) {
            g.setColor(cr.getForeground());
            Rectangle2D r = cr.getRectangle();
            Graphics2D g2 = (Graphics2D) g;
            g2.draw(new Rectangle2D.Double(r.getX() * JPanel1.getWidth(), r.getY() 
                    * JPanel1.getHeight(),r.getWidth() * JPanel1.getWidth(), 
                    r.getHeight() * JPanel1.getHeight()));
        }

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

1 Ответ

1 голос
/ 21 мая 2019

Поскольку класс ArrayList реализует интерфейс List, вы можете сделать это просто, просто используя метод .addAll(Collection c) из интерфейса List.

ArrayList<ShapeClass> allShape = new ArrayList<>();    
allShape.addAll(emptyRectangle);
allShape.addAll(filledRectangles);
allShape.addAll(lineArray);

Редактировать:

Подход 1: У вас нет доступа к ShapeClass

Когда объектдобавленный в коллекцию (расширяющегося универсального типа), фактический класс объекта не будет изменен.Вы можете вернуть его класс, используя метод .getClass ().Тем не менее, он должен быть приведен к исходной форме, прежде чем его метод может быть вызван

    for(ShapeClass shape: allShapes) {
        System.out.println(shape.getClass()); // class <actual class>
        if(shape instanceof Triangle) {
            Triangle tri = (Triangle) shape;
            tri.paint();
        } else if(shape instanceof Rectangle) {
            Rectangle rec = (Rectangle) shape;
            rec.paint();
        }
    }

Подход 2 (лучше) : у вас есть доступ к ShapeClass (динамическое связывание)

Было бы легче достичь той же цели, если у вас есть доступв общий класс (например, ShapeClass).В этом случае вам нужно только определить метод paint() в ShapeClass и переопределить его в подклассе (например, Rectangle).

Вызов метода динамически связан в Java.Таким образом, JVM проверит фактический тип и вызовет для вас наиболее конкретный метод

    ArrayList<ShapeClass> allShape = new ArrayList<>();
    allShape.addAll(emptyRectangle);
    allShape.addAll(filledRectangles);
    allShape.addAll(lineArray);

    for(ShapeClass shape: allShape) {
        shape.paint();   // make sure you have a paint() method in the ShapeClass, and it is overriden in the subclass. 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...