扩展 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' 只能以两种方式之一使用:

  1. 为了避免在构造函数参数的方法与其字段共享相同名称时发生混淆。例如:

public void change(int age) {
    String name = "Tom";

    this.age = age;
    this.name = name;
  }

  1. 显式构造函数调用:在构造函数中,您还可以使用 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 中被调用。