Tworzę prostą grę na moje zajęcia. Mam listę tablicy zawierających różne rodzaje wrogów wykonanych z różnych zajęć, które stworzyłem. Wszystkie obiekty mają metodę o nazwie drawEnemy, która rysuje obiekt do ekranu (dzięki czemu funkcja drawEnemy() jest w każdej klasie). Próbuję narysować wszystkie obiekty w tablicy w pętli rysowania.

ArrayList<Object> enemies;

enemies.add(new enemy1())
enemies.add(new enemy2())
enemies.add(new enemy3())

void draw(){
    for(Object i : enemies)
      i.drawEnemy();
}

To mówi mi, że funkcja drawEnemy nie istnieje.

2
Tahseen 1 styczeń 2020, 22:31

1 odpowiedź

Najlepsza odpowiedź

Zdefiniowałeś enemies jako ArrayList<Object>, co oznacza, że ITeresting nim powróci Object referencje (niezależnie od rzeczywistych typów środowiska wykonawczego).

Jeśli chcesz iterować ponad listę takich wrogów, należy wyodrębnić wspólny interfejs lub klasę bazową dla wszystkich klas wroga i użyć go do typu listy:

public interface Enemy {
    void drawEnemy();
}

public class Enemy1 implements Enemy {
    // code...
}

public class Enemy2 implements Enemy {
    // code...
}

public class Enemy3 implements Enemy {
    // code...
}

ArrayList<Enemy> enemies;
// list is then initialized and populated as it was

void draw() {
    for (Enemy i : enemies) // Note the i is defined as an Enemy
      i.drawEnemy();
}
1
Mureinik 1 styczeń 2020, 20:10