我正在用Java创建一个图形库(我知道已经有很多了)。
我有一个抽象类“Graph”,它包含宽度和高度的变量以及绘制比例的方法和绘制图形的抽象方法。我有多个扩展Graph类的类,比如LineGraph,BarGraph等,它们有一个绘制图形的方法。
由于图形的宽度和高度需要在创建图形的新实例时设置,我想在构造函数中进行,但是当我尝试Eclipse时,仍然希望我在每个类中创建一个单独的构造函数。是否有可能有一个带有构造函数的抽象类,你会怎么做?
答案 0 :(得分:2)
你可以在抽象类中使用构造函数,它包含宽度和高度。但是你仍然需要在每个派生类中都有构造函数,它们采用宽度和高度,但是将处理委托给超类。
您可能需要执行以下指定的操作,
public abstract class Graph {
public Graph(int width, int height) {
// do actual things with width and height
}
}
public class LineGraph extends Graph{
public LineGraph(int width, int height) {
super(width, height);
// additional inits.
}
}
public class BarGraph extends Graph{
public BarGraph(int width, int height) {
super(width, height);
// additional inits.
}
}
答案 1 :(得分:1)
它不是日食。它是强制执行此操作的Java编译器。如果已在Abstract Class中定义了构造函数。必须从派生类中调用该构造函数。
答案 2 :(得分:1)
在抽象中使用构造函数的概念有助于程序员将属性分配给所有继承的子类。
通常人们使用抽象构造函数来初始化一些可以在其子类中使用的属性。
现在,如果您希望这样做,您可以使用此策略。
您可以参考这篇文章来更好地理解这个概念 - > link
答案 3 :(得分:0)
如果使用继承,则可以使用基类构造函数来指定高度和宽度的值。 但是在这种情况下,您需要在基类中使用默认构造函数以及参数化构造函数,或者您必须从派生类调用基类的参数化构造函数。
答案 4 :(得分:-1)
对于每个子类,您需要创建一个具有相同签名(或不具有)的构造函数,因此如果您不希望子类的构造函数中有任何行为,只需添加super();
示例:
abstract class Graph {
int width;
int height;
public Graph(int width, int height) {
this.width = width;
this.height = height;
}
}
class LinearGraph extends Graph {
public LinearGraph(int width, int height) {
super(width, height);
}
}