Расширение класса Kotlin с помощью первичного и вторичного конструктора - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь расширить класс, имеющий первичные и вторичные конструкторы. Причина в том, что я хочу частный / защищенный первичный конструктор, который имеет поля, общие для двух вторичных конструкторов. Это прекрасно работает для базового класса, но расширяя , этот класс не позволяет мне сделать это.

Вот пример того, что я хочу сделать:

abstract class A constructor(val value: Int) {

    var description: String? = null
    var precision: Float = 0f

    constructor(description: String, value: Int) : this(value) {
        this.description = description
    }

    constructor(precision: Float, value: Int) : this(value) {
        this.precision = precision
    }

    abstract fun foo()
}



class B(value: Int) : A(value) {
    // Compiler complains here: Primary constructor call expected.
    constructor(longDescription: String, value: Int) : super(longDescription, value)
    // Compiler complains here: Primary constructor call expected.
    constructor(morePrecision: Float, value: Int) : super(morePrecision, value)

    override fun foo() {
        // Do B stuff here.
    }
}

1 Ответ

0 голосов
/ 01 ноября 2018

Ваш производный класс B имеет первичный конструктор B(value: Int), поэтому его вторичные конструкторы должны вызывать первичный конструктор, используя this(...) вместо super(...).

Это требование описано здесь: Конструкторы

Чтобы решить эту проблему, просто удалите первичный конструктор из B вместе с его вызовом супер-конструктора, это позволит вторичным конструкторам напрямую вызовите вторичные конструкторы суперкласса:

class B : A {
    constructor(longDescription: String, value: Int) : super(longDescription, value)
    constructor(morePrecision: Float, value: Int) : super(morePrecision, value)

    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...