java и конструкторы наследования - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть класс Item, выполненный следующим образом

public class Item {


private static int nextId = 0;
private double xCoord, yCoord; //location
private double length, height; // define size of item
private String spriteImage;
private Tank tank;
private String id;


protected Item(double xCoord, double yCoord, String spriteImage, double length, double height,  Tank tank) throws ItemException {
    setId("I"+nextId); 
    nextId++;   
    setLocation(xCoord,yCoord);
    setSpriteImage(spriteImage);        
    setLength(length);
    setHeight(height);      
    setTank(tank);
}


/**
 * Set this item's location.
 * 
 * @param xCoord the column coordinate.
 * @param yCoord the row coordinate.
 */
public void setLocation(double xCoord, double yCoord) {
    this.xCoord = xCoord;
    this.yCoord = yCoord;
}

public double getXCoord() {
    return xCoord;
}

public double getYCoord() {
    return yCoord;
}

public double getLength() {
    return length;
}

public void setLength(double length) throws ItemException{
    if(length<=0) {
        throw new ItemException("MSG_ERR_LENGTH_VALUE");
    }
    this.length = length;
}

public double getHeight() {
    return height;
}

public void setHeight(double height) throws ItemException{
    if(height<=0) {
        throw new ItemException("MSG_ERR_HEIGHT_VALUE");
    }
    this.height = height;
}

public void setSpriteImage(String spriteImage) {

    this.spriteImage = spriteImage;
}

public String getSpriteImage() {        
    return spriteImage;
}

public String getId() {
    return id;
}

protected void setId(String id) {
    this.id = id;
}

public Tank getTank() {
    return tank;
}

public void setTank(Tank tank){
    if(tank!=null) {
        if(!tank.getItems().contains(this)) {
                tank.getItems().add(this);
        }
    }

    if(this.tank!=null) {
        try{
            this.tank.removeItem(this);
        }catch(Exception e) {
            //removeItem: El item no existe ya en el tanque
        }
    }

    this.tank = tank;
}


@Override
public String toString() {
    StringBuilder str = new StringBuilder("(" + getXCoord() +",  "+ getYCoord() +") ");

    str.append(getId() + " ");
    str.append(getLength() + " ");
    str.append(getHeight() + " ");
    str.append((getTank()!=null)?getTank().getName():"No tank");
    return str.toString();
}
}

Моя проблема в том, что мне нужно реализовать два класса, один из которых наследуется от Items, из которых они меня спрашивают: этот класс имеет только конструктор, и это будет с параметрами. Их порядок будет: xCoord, yCoord, длина, высота, энергия и бак. Значение spriteImage всегда будет одинаковым: "./images/food/seed.png" Я реализовал его следующим образом

public class Food extends Item {

double speed=1;
boolean eaten;
int energy;


protected Food(double xCoord, double yCoord, String spriteImage,  double length, double height,int energy, Tank tank)
        throws Exception {
    super(xCoord, yCoord, spriteImage, length, height, tank);   
    setSpeed(speed);
    setEnergy(energy);
    setSpriteImage("./images/food/seed.png");
}

Другой класс такой же, они спрашивают меня, что этот класс будет иметь один конструктор и будет с параметрами, порядок которых будет: xCoord, yCoord, длина, высота и бак. Значение spriteImage всегда будет одним и тем же: параметры, которые мне сообщают.

Конструктор, в зависимости от суперкласса, всегда создает для меня в Super () параметры, которые поступают из Item, но они просят меня иметь только те параметры, которые они запрашивают у меня потому что это означало бы удаление «spriteImage» из конструктора суперкласса.

Каким-то образом?

Не мог ли класс элементов быть абстрактным?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Вы также можете игнорировать параметр spriteImage и вызывать super() с постоянной строкой:

protected Food(double xCoord, double yCoord, String spriteImage, double length, double height, int energy, Tank tank) throws Exception {
    super(xCoord, yCoord, "./images/food/seed.png", length, height, tank);
    //                         ↑ here we put our default value instead of the spriteImage parameter
    setSpeed(speed);
    setEnergy(energy);
}

, тогда мы могли бы удалить параметр spriteImage:

protected Food(double xCoord, double yCoord, double length, double height, int energy, Tank tank) {...}
0 голосов
/ 23 апреля 2020

Вы можете просто опустить spriteImage из детских каторов. Результат должен быть примерно таким:

public class Food extends Item {
   private static String foodSpriteImage = "./images/food/seed.png";
   private double speed=1;
   private boolean eaten;
   private int energy;

   // Child Ctor needs to be public.
   public Food(double xCoord, 
                  double yCoord, 
                  double length, 
                  double height,
                  int energy, 
                  Tank tank)
        throws Exception {
       super(xCoord, yCoord, foodSpriteImage , length, height, tank);   
       setEnergy(energy);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...