扩展父参数的类默认值

时间:2019-02-21 15:08:27

标签: kotlin constructor instance instantiation default-parameters

我有一个类B和参数xy,它们是从类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中设置默认值

3 个答案:

答案 0 :(得分:2)

您可以使用辅助构造函数来实现。

$('#searchBox').keyup(function ()

有关更多信息,请参见Kotlin Docs

编辑:

@PietroMartinelli提到,如果需要主构造函数,则辅助构造函数将不起作用。如果派生类具有主构造函数,则可以(并且必须)使用主构造函数的参数在该位置初始化基类。

答案 1 :(得分:2)

@Januson的答案中提出的方法非常好,而且很干净,当您没有/将不会在B子类中定义主构造函数时。如果尝试这样做,则会出现编译器错误,因为辅助构造函数必须调用主构造函数,而不能直接调用超类构造函数。

如果您的B子类需要定义一个主构造函数,则可以解决将默认值定义为A companion对象中的常量的问题,并使用它在AB的主要构造函数中,如下所示:

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中都不需要重复其值。 ..

答案 2 :(得分:0)

在您的情况下,这样的事情可能会对您有所帮助!

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

class B(y: Int, x: Int) : A() {
    constructor(y: Int) : this(y, if (y == 0) 238 else 0)
}

open class A(x: Int = 238)