Конструктор расширенного класса

1

Я получил очень сложный класс под названием "Линия" и расширенный, ColouredLine, который просто добавляет к нему цвет.

Как создать ColouredLine из строки в конструкторе?

Вот мой код (который не работает...)

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

}

Благодаря !

  • 0
    Я только что обновил свой ответ.
Теги:
extends

3 ответа

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

}
  • 0
    Спасибо, я думаю, что воспользуюсь этим! Это добавляет некоторый код в класс Line, хотя ...
0

Используйте модель делегата. Не нужно изменять базовый класс Line.

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;
        }
}
  • 0
    Как насчет изменения значений строки? Это изменит фактический объект линии, переданный в конструкторе ColouredLine. Я бы предложил защитную копию.
  • 0
    Спасибо, но я буду использовать метод Эрана, я думаю :)
Показать ещё 1 комментарий
0

Неправильное использование ключевого слова "this":

"это" можно использовать только одним из двух способов:

  1. Во избежание путаницы, когда метод конструктора имеет то же имя, что и их поля. Например:

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

    this.age = age;
    this.name = name;
  }
  1. Явный вызов конструктора. Внутри конструктора вы также можете использовать это ключевое слово для вызова другого конструктора в том же классе.

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() всегда будет вызываться во всех его подклассах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню