Вызов суперконструктора из вторичного конструктора - PullRequest
0 голосов
/ 09 октября 2019

У меня есть класс Circle, который расширяет CanvasElement. Я хочу иметь возможность создать круг, просто указав радиус И, начав с общего набора значений. На данный момент мой код выглядит неуклюже, устанавливая каждое значение из суперкласса по одному. Как я могу просто вызвать суперструктуры со всеми значениями (posX, posY и т. Д., Переданными в вызов конструктора?

class Circle(var radius : Double = 0.0) : CanvasElement(){
constructor(posX : Double,
        posY : Double,
        radius : Double,
        fill : String,
        stroke : String) : this(radius){
    this.fill = fill
    this.stroke = stroke 

    this.posX = posX
    this.posY = posY
}

Класс: CanvasElement

open class CanvasElement(
    var posX : Double = 0.0,
    var posY: Double = 0.0,
    var fill : String = "",
    var stroke : String = ""){
}

Для лучшего понимания,Я добавил код Java для того, чего я хочу достичь:

Круг

public class Circle extends CanvasElement{
    private int radius;

    public Circle(int radius){
        super(0,0);
        this.radius = radius;
    }
}

CanvasElement

public class CanvasElement{
    private double posX;
    private double posY;

    public CanvasElement(double posX, double posY){
        this.posX = posX;
        this.posY = posY;
    }
}

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Хотели бы вы иметь что-то подобное?

open class CanvasElement(var posX: Double , var posY: Double, var fill: String , var stroke: String)

class Circle(var radius: Double = 0.0,
             posX: Double = 0.0,
             posY: Double = 0.0,
             fill: String = "",
             stroke: String = "") : CanvasElement(posX, posY, fill, stroke)

ЕСЛИ я вас правильно понял, вы не хотите, чтобы у CanvasElement были деактиваторы, и вы хотите иметь возможность создать Circleопределяя только radius и, возможно, другие свойства, которыми обладает CanvasElement.

1 голос
/ 09 октября 2019

Почему бы не использовать значения по умолчанию, которые вы использовали в CanvasElement?:

class Circle(
    var radius : Double = 0.0,
    var posX : Double = 0.0,
    var posY: Double = 0.0,
    var fill : String = "",
    var stroke : String = ""
) : CanvasElement(posX, posY, fill, stroke)

Это объявление позволит передать любое количество параметров:

Circle() // Circle(radius = 0.0) + CanvasElement(0.0, 0.0, "", "")
Circle(10.0) // Circle(radius = 10.0) + CanvasElement(0.0, 0.0, "", "")
Circle(10.0, 1.0, 2.0, "red", "black") // Circle(radius = 10.0) + CanvasElement(1.0, 2.0, "red", "black")
...