我有一个类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
中设置默认值
答案 0 :(得分:2)
您可以使用辅助构造函数来实现。
$('#searchBox').keyup(function ()
有关更多信息,请参见Kotlin Docs。
编辑:
@PietroMartinelli提到,如果需要主构造函数,则辅助构造函数将不起作用。如果派生类具有主构造函数,则可以(并且必须)使用主构造函数的参数在该位置初始化基类。
答案 1 :(得分:2)
@Januson的答案中提出的方法非常好,而且很干净,当您没有/将不会在B
子类中定义主构造函数时。如果尝试这样做,则会出现编译器错误,因为辅助构造函数必须调用主构造函数,而不能直接调用超类构造函数。
如果您的B
子类需要定义一个主构造函数,则可以解决将默认值定义为A
的 companion对象中的常量的问题,并使用它在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
中都不需要重复其值。 ..
答案 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)