扩展 class 构造函数
Extended class constructor
我有一个非常复杂的 class 叫做 Line,还有一个扩展的 ColouredLine 只是给它添加了一种颜色。
如何从构造函数中的 Line 创建 ColouredLine?
这是我的代码(行不通……)
private class ColouredLine extends Line {
private Color color;
public ColouredLine(Line line, Color color) {
this = (ColouredLine)line;
this.color = color;
}
}
谢谢!
class:
行中需要复制构造函数
public class Line
{
...
public Line (Line line)
{
// copy properties of line
this.something = line.something ...
}
...
}
然后在ColouredLine
的构造函数中,调用Line
的复制构造函数:
private class ColouredLine extends Line {
private Color color;
public ColouredLine(Line line, Color color) {
super (line);
this.color = color;
}
}
使用委托模型。无需修改基线class.
private class ColouredLine extends Line {
private Color color;
private final Line line;
public ColouredLine(Line line, Color color) {
this.line = line;
this.color = color;
}
/**
* Delegates Line methods to the line object
**/
@Override
public int getProperty1() {
return line.getProperty1();
}
/**
* Specific ColouredLine methods
**/
public Color getColor() {
return color;
}
}
'this'关键字的不当使用:
'this' 只能以两种方式之一使用:
- 为了避免在构造函数参数的方法与其字段共享相同名称时发生混淆。例如:
public void change(int age) {
String name = "Tom";
this.age = age;
this.name = name;
}
- 显式构造函数调用:在构造函数中,您还可以使用 this 关键字调用同一 class 中的另一个构造函数。
public class Rectangle {
private int x, y;
private int width, height;
public Rectangle() {
this(0, 0, 1, 1);
}
public Rectangle(int width, int height) {
this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
...
}
'this' 永远不能单独使用,也不能从超类 class.
调用构造函数
而是使用 Super() 关键字来调用修改后的超级构造函数。在这样做之前,你必须修改超级 class 构造函数以在其参数中使用一个 Line 对象,像这样,
public Line (Line line)
并且在子class构造函数的第一行,简单地调用超级构造函数:
super(line);
请注意,如果不定义新构造函数,默认构造函数 public Line() 将始终在其所有子classes 中被调用。
我有一个非常复杂的 class 叫做 Line,还有一个扩展的 ColouredLine 只是给它添加了一种颜色。
如何从构造函数中的 Line 创建 ColouredLine?
这是我的代码(行不通……)
private class ColouredLine extends Line {
private Color color;
public ColouredLine(Line line, Color color) {
this = (ColouredLine)line;
this.color = color;
}
}
谢谢!
class:
行中需要复制构造函数public class Line
{
...
public Line (Line line)
{
// copy properties of line
this.something = line.something ...
}
...
}
然后在ColouredLine
的构造函数中,调用Line
的复制构造函数:
private class ColouredLine extends Line {
private Color color;
public ColouredLine(Line line, Color color) {
super (line);
this.color = color;
}
}
使用委托模型。无需修改基线class.
private class ColouredLine extends Line {
private Color color;
private final Line line;
public ColouredLine(Line line, Color color) {
this.line = line;
this.color = color;
}
/**
* Delegates Line methods to the line object
**/
@Override
public int getProperty1() {
return line.getProperty1();
}
/**
* Specific ColouredLine methods
**/
public Color getColor() {
return color;
}
}
'this'关键字的不当使用:
'this' 只能以两种方式之一使用:
- 为了避免在构造函数参数的方法与其字段共享相同名称时发生混淆。例如:
public void change(int age) {
String name = "Tom";
this.age = age;
this.name = name;
}
- 显式构造函数调用:在构造函数中,您还可以使用 this 关键字调用同一 class 中的另一个构造函数。
public class Rectangle {
private int x, y;
private int width, height;
public Rectangle() {
this(0, 0, 1, 1);
}
public Rectangle(int width, int height) {
this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
...
}
'this' 永远不能单独使用,也不能从超类 class.
调用构造函数而是使用 Super() 关键字来调用修改后的超级构造函数。在这样做之前,你必须修改超级 class 构造函数以在其参数中使用一个 Line 对象,像这样,
public Line (Line line)
并且在子class构造函数的第一行,简单地调用超级构造函数:
super(line);
请注意,如果不定义新构造函数,默认构造函数 public Line() 将始终在其所有子classes 中被调用。