Kotlin:子构造函数如何使用其父级的辅助构造函数?

Jir*_*ire 5 inheritance constructor kotlin

例如,我们有这个父母:

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

还有一个子节点,它必须同时具有两个参数构造函数和一个空构造函数,如父节点:

class Child(id: Int, name: String?) : Parent(id, name) {
    constructor() : super() // syntax error
}
Run Code Online (Sandbox Code Playgroud)

子构造函数如何使用其父级的辅助构造函数?

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

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

Lov*_*vis 7

实现这一目标的最佳方法是使用构造函数的默认参数

class Child(id: Int = -1, name: String? = null) : Parent(id, name)
Run Code Online (Sandbox Code Playgroud)

取决于你在Parent课堂上的影响力,甚至可能

class Parent(val id: Int = -1, val name: String? = null)
Run Code Online (Sandbox Code Playgroud)

这有一个"缺点":你在技术上会得到三个不同的构造函数.但我无法看出这可能是一个问题,因为无论如何你必须处理id=-1name=null案件.

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

class Child(id: Int, name: String?) : Parent(id, name) {
    constructor() : this(-1, null) 
}
Run Code Online (Sandbox Code Playgroud)

在任何方面都是坏的或"多余的" - 恰恰相反:它具有高度的表现力和明确性,所以读者确切地知道你的意图是什么.


hol*_*ava 5

首先,您不能扩展Parent该类,因为它不是opened。

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

另一方面,如果要通过关键字调用superlcass的构造函数super。您需要使主要构造函数成为次要构造函数,例如:

class Child : Parent {
  constructor(id: Int, name: String?) : super(id, name)
  constructor() : super()
}
Run Code Online (Sandbox Code Playgroud)

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

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