2014-12-18 8 views
0

У меня есть класс GameObject:объекты переопределяют друг друга

public class GameObject{ 

    private Coordinate coordinates; 

    public GameObject(){ 
     coordinates = new Coordinate(); 
    } 

    public void setCoordinates(int x, int y){ 
     coordinates.x = x; 
     coordinates.y = y; 
    } 

    //More methods here 
} 

public class Coordinate{ 

    public int x, y; 

    public Coordinate(){ 

    } 

    public Coordinate(int x, int y){ 
     this.x = x; 
     this.y = y; 
    } 

    public void setCoordinate(int x, int y){ 
     this.x = x; 
     this.y = y; 
    } 

И два класса Champion и Spell:

public class Spell extends GameObject{ 
    //Some methods 
} 

public class Champion extends GameObject{ 
    //Some methods 
    public Spell fireBall = new Spell(); 
} 

И в моем main классе:

Champion character = new Champion();

Если Я ll character.setCoordinates(200, 300); (только случайные числа), символ переходит к этим точным координатам. Но Spell fireBall также относится к (200, 300). Таким образом, coordinates в Spell застрахованы setCoordinates(int x, int y), позвоните по номеру character. Как это возможно?

TL; DR - два класса от GameObject, Spell extends GameObject и Champion extends GameObject, переопределить Афоризм coordinates. Зачем?

Для полного исходного кода:
GameObject.java
Spell.java
Champion.java Coordinate.java

+1

Потому что есть только один экземпляр координат? –

+3

Где вы создаете экземпляр '' координат''? – nrainer

+0

Являются ли корригаторы статическими переменными? – Alan

ответ

5

Глядя на ваш код в GitHub у вас есть 2 метода:

//Set the coordinates for this GameObject 
public void setCoordinates(int x, int y){ 
    this.coordinates.x = x; 
    this.coordinates.y = y; 
} 

public void setCoordinates(Coordinate coordinates){ 
    this.coordinates = coordinates; 
} 

Если вы когда-либо использовать 2-ым, то вы используете один и тот же экземпляр координат таким образом изменяя один изменит другой

Решением является скопировать значения вместо

public void setCoordinates(Coordinate coordinates){ 
    this.coordinates.x = coordinates.x; 
    this.coordinates.y = coordinates.y; 
} 
+0

Да, это исправлено. Я назвал 'spell.fire (character.getCoordinates())', с помощью которого я задал «координаты» 'заклинания' с' setCoordinates (Координаты координат) 'и создав один экземпляр, как вы сказали. Спасибо. – ikhebgeenaccount

0

В классе Spell установить координаты:

this.startCoordinates = startCoordinates; 
setCoordinates(this.startCoordinates); 

Впоследствии этот код

if (getCoordinates().x - startCoordinates.x < range) { 

эквивалентно

if (getCoordinates().x - getCoordinates().x < range) { 

getCoordinates() потому, что ссылки и тот же объект, как startCoordinates делает. Ваш метод setter просто устанавливает ссылку, но не копирует объект.

Смежные вопросы