Search code examples
javaconstructorabstract-classextends

java and inheritance constructors


I have a class called Item done in the following way

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();
}
}

My problem is that I have to implement two classes one of them inherits from Items, from which they ask me: this class only has a constructor and it will be with parameters. The order of these will be: xCoord, yCoord, length, height, energy and tank. The value of spriteImage will always be the same: "./images/food/seed.png" I implemented it as follows

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");
}

The other class is the same, they ask me that this class will have a single constructor and will be with parameters, the order of which will be: xCoord, yCoord, length, height and tank. The value of spriteImage will always be the same: "./images/submarine/submarine.png"

public class SubmarineToys extends Item{


double speed=1;
boolean facingRight=true;
double thresholdReverse=0.0003;

protected SubmarineToys(double xCoord, double yCoord, String spriteImage, double length, double height, Tank tank)
        throws ItemException {
    super(xCoord, yCoord, spriteImage, length, height, tank);
    setSpriteImage("./images/submarine/submarine.png");     
}

My problem is that I can't get the constructors that ask me in both classes to have only the parameters that are told to me.

The constructor, depending on the superclass, always creates for me in Super () the parameters that come from Item, but they ask me to only have the parameters that they ask me for, that would imply removing "spriteImage" from the constructor of the superclass.

Some way?

Couldn't the item class be abstract?


Solution

  • You can simply omit spriteImage from the childrens' ctors. Result should be something like this:

    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);
       }
    }