Kotlin:子构造函数如何使用其父构造函数?

例如,我们有这个家长:

open class Parent(val id: Int, val name: String?) { constructor() : this(-1, null) } 

和一个孩子一样,它必须同时具有父参数构造函数和空构造函数:

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : super() // syntax error } 

子构造函数如何使用其父构造函数?

我知道我可以实现一个子构造函数传递与父类相同的值,但这不仅看起来多余,而且往往是我的孩子有其主要构造函数的额外参数,但不需要中间构造函数(构造函数与参数不包括所有额外的参数)。 下面是一个例子,以这种方式实现它,以防我不清楚:

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : this(-1, null) // no syntax error, but redundant } 

实现这个最好的方法是使用你的构造函数的默认参数

 class Child(id: Int = -1, name: String? = null) : Parent(id, name) 

取决于你对Parent类有多少影响,甚至可能

 class Parent(val id: Int = -1, val name: String? = null) 

这有一个“缺点”,虽然:你会在技术上得到三个不同的构造函数。 但我不明白这可能是一个问题,因为无论如何你必须处理id=-1name=null情况。

另外,我不认为你的解决方案

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : this(-1, null) } 

是坏的,或者说是“多余的”,相反,它是高度表达和明确的,所以读者确切地知道你的意图是什么。

首先,你不能扩展Parent类,因为它没有被open

其次,如果一个类声明了一个主构造函数,则不能通过super关键字调用超类的构造函数。

另一方面,如果你想通过super关键字superlcass的构造函数。 您需要将主构造函数设置为次构造函数,例如:

 class Child : Parent { constructor(id: Int, name: String?) : super(id, name) constructor() : super() } 

另一个选择是让二级构造函数通过this关键字调用主构造函数,但是我认为这是不必要的,并且使用超类的二级构造函数重复了参数:

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : this(-1, null); }