Gå til innhold

Problemer å nå instanser innad samme pakke


Anbefalte innlegg

Hei!

 

Holder på å gjøre en øving med å lage et Sokoban-spill. Jeg tenkte å bruke klasser, og har derfor klasser for bl.a celler, brett, spiller, o.l. Men jeg har problemer med å nå eksempelvis brett-instansen fra spiller-instansen. Koden min ser ut noe som dette:

 

Sokoban.java:

package oeving4;
public class Sokoban {
// static members, etc ...

public Level level = new Level();
public Player player = new Player();

// metoder og sånt her ...

public static void main(String[] args) {
	// foreløpig tom
}
}

 

Level.java:

package oeving4;
public class Level {
private Cell[][] grid = {};

public Cell getCell(int x, int y) {
	return grid[x][y];
}

// Flere irrelevante metoder her ...
}

 

Player.java:

package oeving4;
public class Player {
private int x = 0;
private int y = 0;

public void tryMove(Direction direction) {
	int dx = 0;
	int dy = 0;
	Cell nextCell = level.getCell(x + dx, y + dy);

	// Mer kode ...

}
}

 

I Player-klassen får jeg melding om "level can not be resolved" i linja hvor jeg instansierer nextCell med level.getCell().

Hvordan får jeg til at instansene av Level- og Player-klassene blir tilgjengelig i andre instanser enn Sokoban-klassen? Har prøvd å bruke static, public static, og public når jeg instaniserer dem i Sokoban-klassen, samt instansiere dem i main-metoden som ligger i Sokoban-klassen.

 

Noen tips? :)

Lenke til kommentar
Videoannonse
Annonse

Problemet er at klassen Player ikke har kjennskap til level. For å løse problemet ditt må metoden tryMove kalles med level også. (Antar player.tryMove kalles fra Sokoban en plass)

 

Altså metodehodet må endres til:

public void tryMove(Direction direction, Level level){}

 

Dette fører imidlertid ikke til verdens beste innkapsling. Kanskje burde metoden tryMove flyttes til klassen level, og så returnerer denne en ny posisjon som spilleren kan oppdateres med etterpå?

Lenke til kommentar

Ja, du er inne på noe der. En heller dårlig løsning jeg fant før jeg forkastet hele greia, var å lage en lokal level-variabel inni Player-klassen, og gi level-instansen som et argument til konstruktøren:

 

package oeving4;
public class Player {
private int x = 0;
private int y = 0;
private Level level = null;

public Player(Level level) {
	this.level = level;
}

public void tryMove(Direction direction) {
	int dx = 0;
	int dy = 0;
	Cell nextCell = level.getCell(x + dx, y + dy);

	// Mer kode ...

}
}

 

Og så i Sokoban-klassen:

 

public Level level = new Level();
public Player player = new Player(level);

Lenke til kommentar
Altså, du har en klasse som er Sokoban som er hovedklassen din(inneholder main), du vil altså bruke metodene i en klasse uten å instansiere dem? Da må de vel være abstract? Eller tar jeg feil her?

Ja. Du tenker kanskje på static.

 

Jepp var visst det! :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...