2

在我的代码中,我有一个主类和几个子类:

public abstract class Items {
    public int itemId;

    public int getItemId() {
        return itemId;
    }

    public void setItemId(int itemId) {
        this.itemId = itemId;
    }

    public Items(int itemID) {
        setItemId(itemID);
    }
}

 abstract class Equipment extends Items {
    public double attackBonus;
    public double defenceBonus;
    public double speedBonus;

    public String equipItem() {
    return itemName + " has been equiped";
    }
}

class Gathering extends Items {
}

class Creation extends Items {

}

我在主类中获得了构造函数,但它不起作用,但如果我将它们放入 Gathering and Creation 类。唯一的问题是这会导致我重复代码,这就是为什么我希望在主类中使用它,但这会导致我出错。

错误是:默认构造函数未定义隐式超级构造函数 Items()。必须定义显式构造函数

4

3 回答 3

3

您的问题不清楚,但构造函数需要显式实现超类包含一个带有一个或多个参数的构造函数:

class Gathering extends Items {

    public Gathering(int itemID) {
        super(itemID);
    }
}
于 2013-11-10T00:57:23.280 回答
1

因为您没有“默认构造函数”,这在 Java 中意味着没有参数的构造函数,所以在您的超类中,您的子类不能使用在您未指定构造函数时默认提供的默认构造函数。

想想一个整数有多少个可能的值。当然,它可以调用 super (0),但很难知道它正在发生。如果您希望您的子类默认为 3,该怎么办?因此,Java 不必为此烦恼——如果父类中没有默认值,则必须在子类中创建自己的构造函数。

于 2013-11-10T01:04:59.287 回答
0

我可以看到两种方法来避免重复构造函数。最简单的方法是使用默认构造函数,然后使用你的 setter:

Gathering g = new Gathering();
g.setItemId(6);

你可以用一些方法链把它变成一行: in Items, add

public Items setTItemId(int itemId) {
    setItemId(itemId);
    return this;
}

然后你可以打电话

Creation c = (Creation) ( (new Creation()) .setTItemId(7) );

但我不知道最后一行的可读性如何。

编辑:

第三种方法使用泛型,但您必须删除Equipment. 从...开始

abstract class Item<T extends Item>

使用相同的链接设置器

@SuppressWarnings("unchecked")
public T setTItemId(int itemId) {
    setItemId(itemId);
    return (T)this;
}

然后

class Creation extends Item<Creation> {}

让你打电话

Creation c = (new Creation()) .setTItemId(7);
于 2013-11-14T16:00:29.217 回答