расширить значение класса по умолчанию для родительского параметра - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть класс B с параметрами x и y, расширенными с класса A с параметром x, который является необязательным (все параметры имеют ненулевое значение), как я могу определить B вспособ, которым это было бы необязательно, и это использовало бы дополнительное значение в конструкторе A

val y = 0
val b = if (y == 0) B(y) else B(y, 0)

class B(y: Int, x: Int = 238) : A(x)

open class A(x: Int = 238)

здесь я установил значение по умолчанию для x в конструкторе B есть ли способдостигните этого без установки значения по умолчанию в B

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Подход, предложенный в ответе @ Januson, очень приятный и чистый, когда вы не используете / определите первичный конструктор в подклассе B.Если вы попытаетесь это сделать, вы получите ошибки компилятора, потому что вспомогательные конструкторы должны вызывать первичный конструктор и не могут напрямую вызывать конструкторы суперкласса.

Если вам B подклассу нужно определить первичный конструктор, вы можете обратиться кпроблема определения значения по умолчанию как константы в A ' сопутствующем объекте и его использования в основных конструкторах A и B следующим образом:

open class A(val x: Int = DefaultX) {
    companion object {
        val DefaultX:Int = 238;
    }
}

class B(y: Int, x: Int = DefaultX) : A(x)

Таким образом, вы определяете эквивалент переменной Java static final, имеющей область действия A.

Вы должны ссылаться на константу A.DefaultX суперкласса в подклассе B, но выне нужно дублировать его значение как в классе A, так и в классе B ...

0 голосов
/ 21 февраля 2019

Этого можно добиться с помощью вспомогательных конструкторов.

class B : A {
    constructor(y: Int): super()
    constructor(y: Int, x: Int): super(x)
}

Для получения дополнительной информации см. Документы Kotlin .

Редактировать:

As @PietroMartinelliупоминает, что вторичные конструкторы не будут работать, если вам нужен первичный конструктор.Если производный класс имеет первичный конструктор, базовый класс можно (и нужно) инициализировать прямо здесь, используя параметры первичного конструктора.

...