在子类中重写构造函数

时间:2017-03-27 07:36:15

标签: java oop constructor super

构造函数存在以下问题。我试图重写Cel的函数,GameObjectGameObject的一个子类(x需要ywidthheightidxPosGrid)。我想添加yPosGrid//Constructor that does work public Cel(int x, int y, int width, int height, ID id) { super(x, y, width, height, id); } //Constructor that doesn't work public Cel(int xPosGrid, int yPosGrid, Grid grid, ID id) { x = grid.x + grid.celWidth * xPosGrid; y = grid.y + grid.celHeight * yPosGrid; width = grid.celWidth; height = grid.celHeight; this.id = id; this.xPosGrid = xPosGrid; this.yPosGrid = yPosGrid; } //GameObject Constructor public GameObject(int x, int y, int width, int height, ID id) { this.x = x; this.y = y; this.width = width; this.height = height; this.id = id; } 以确保我知道网格中所有Cels的位置。但是我并不想让构造函数变得非常长。所以我想使用第二个构造函数(下面)。

但这给了我一个错误

  

隐式超级构造函数GameObject()未定义。必须显式调用另一个构造函数

任何人都可以告诉我如何解决这个问题。非常感谢。

std::string

4 个答案:

答案 0 :(得分:1)

您总是需要先在构造函数中调用超级构造函数。

public Cel(int x, int y, int width, int height, ID id) {
    super(x, y, width, height, id);
}

public Cel(int xPosGrid, int yPosGrid, Grid grid, ID id) {
    super(0,0,0,0,id);
    x = grid.x + grid.celWidth * xPosGrid;
    y = grid.y + grid.celHeight * yPosGrid;
    width = grid.celWidth;
    height = grid.celHeight;
    this.id = id;
    this.xPosGrid = xPosGrid;
    this.yPosGrid = yPosGrid;
}

如果您可以稍后设置x和y以及宽度和高度,则可以对其进行修改

public Cel(int xPosGrid, int yPosGrid, Grid grid, ID id) {
    super(0,0,0,0,id);
    x = grid.x + grid.celWidth * xPosGrid;
    y = grid.y + grid.celHeight * yPosGrid;
    width = grid.celWidth;
    height = grid.celHeight;
    this.id = id;
    this.xPosGrid = xPosGrid;
    this.yPosGrid = yPosGrid;

    // do some calculations to caluclate the pos and dimensions.

    this.setX(x);
    this.setY(y);
    this.setWidth(width);
    this.setHeight(height);
}

答案 1 :(得分:0)

您的GameObject似乎没有定义空构造函数。如果省略对super的调用,Java会隐式添加super()作为子构造函数的第一个语句。

解决方案:向GameObject添加一个空构造函数(使protected避免意外)或明确调用thissuper

答案 2 :(得分:0)

如果您不致电super(...)this(...),则编译器会添加super()。正如错误告诉你的那样:没有没有参数的超级构造函数。因此,您需要添加此构造函数或使用虚拟值调用现有的超级构造函数。

答案 3 :(得分:0)

错误。您不能拥有两个构造函数,并将它们称为两者作为同一个对象。

当你写new Cel()时......你必须准确地给出与你的consturctors的一个匹配的参数。

您以后无法进入并调用其他构造函数。从这个意义上说:了解子类的基本属性是什么,然后提供一个构造函数来适应该模型。