1

我有一个超类“BuildingMaterial”和大量子类,即石头、木材、粘土等。所有子类的行为都相似:1 个 int 字段以单位存储建筑材料的数量。它们可以无参数构造或使用 int 构造。我已经知道 BuildingMaterial 的所有子类都将具有这两个构造函数,我如何避免将它们编码到每个单独的类中?这是我不想在每节课上做的一个例子:

public final class Stone extends BuildingMaterial {

    private int amount;

    //constructors
    public Stone() {
      amount = 0;
    }

    public Stone(int i) {
      amount = i;
    }

    //methods
    public int getAmount() {
      return amount;
    }
}
4

5 回答 5

5

可悲的是,答案是你不能。这是 Java 语言的限制。每个类都需要自己的构造函数——不能简单地从父类继承它们。Java 编译器将为您生成的唯一构造函数是默认构造函数(无参数),并且仅在您根本不指定任何构造函数时才会生成。

你可以在这里做的最好的事情是重构你的代码,所以amount在超类中:

public abstract class BuildingMaterial {

    private int amount;

    //constructors
    public BuildingMaterial() {
      this(0);
    }

    public BuildingMaterial(int i) {
      amount = i;
    }

    //methods
    public int getAmount() {
      return amount;
    }

}

然后利用super调用在你的子类中委托超类的构造函数:

public final class Stone extends BuildingMaterial {

    //constructors
    public Stone() {
      super();
    }

    public Stone(int i) {
      super(i);
    }

}

请注意,我将您的无参数构造函数的主体从amount=0;更改为this(0);。我个人认为这是更好的风格,因为如果您决定将其他初始化代码添加到您的构造函数主体中,您只需将其添加到 1 参数构造函数中,而零参数构造函数会将所有工作委托给它。

于 2013-09-14T17:32:12.480 回答
2

你必须使用继承

public abstract class BuildingMaterial {
    private int amount;

    //constructors
    public BuildingMaterial() {
        amount = 0;
    }

    public BuildingMaterial(int i) {
        amount = i;
    }

    //methods
    public int getAmount() {
        return amount;
    }
}


public class Stone extends BuildingMaterial {
    public Stone() {
        super();
    }

    public Stone(int i) {
        super(i);
    }
}

这样,所有的子类都BuildingMaterial可以amount通过 getter 和 setter 访问。

您可能已经amount声明,protected因此您不需要 getter 或 setter 来访问子类中的该字段。

于 2013-09-14T17:26:55.667 回答
1

使用super关键字来减少你的代码,但它super 是构造函数中的第一行

public class Stone extends BuildingMaterial {
    public Stone() {
        super();
    }

    public Stone(int i) {
        super(i);
    }
} 
于 2013-09-14T17:29:28.180 回答
0

如果所有类都具有该属性amount,则该属性可以从父类继承。amount在您的父类中定义BuildingMaterial,然后从您的子类构造函数中调用父构造函数super来设置amount值。

于 2013-09-14T17:22:45.603 回答
0

不清楚你想在你的问题中避免什么......假设你正在谈论避免在所有子类中编写多个构造函数。我相信这是不可能的。下面定义 BuildingMeterial 构造函数并从 baseClass 调用 super() 的帖子将是使用的最佳解决方案。

于 2013-09-14T17:34:06.020 回答