扩展类构造函数

时间:2015-01-01 14:17:25

标签: java extends

我有一个名为Line的非常复杂的类,以及一个扩展的类ColouredLine,它只是为它添加了一种颜色。

如何在构造函数中从Line创建ColouredLine?

这是我的代码(不起作用......)

private class ColouredLine extends Line {
    private Color color;
    public ColouredLine(Line line, Color color) {
        this = (ColouredLine)line;
        this.color = color;
    }

}

谢谢!

3 个答案:

答案 0 :(得分:4)

您需要Line类中的复制构造函数:

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;
    }

}

答案 1 :(得分:0)

使用委托模型。无需修改基线类。

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;
        }
}

答案 2 :(得分:0)

'this'关键字的使用不当:

'this'只能以下列两种方式之一使用:

  1. 当构造函数参数的方法与其字段共享同一名称时,避免混淆。例如:
  2. public void change(int age) {
        String name = "Tom";
    
        this.age = age;
        this.name = name;
      }

    1. 显式构造函数调用:在构造函数中,您还可以使用this关键字来调用同一个类中的另一个构造函数。
    2. 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'永远不能单独使用,也不能从超类中调用构造函数。

      而是使用Super()关键字来调用修改后的超级构造函数。在这样做之前,你必须修改超类构造函数以在其参数中获取Line对象,如下所示

      public Line (Line line)
      

      在子类构造函数的第一行,只需调用超级构造函数:

      super(line);
      

      请注意,如果不定义新的构造函数,则始终会在其所有子类中调用默认构造函数public Line()。