例如,我们有这个父母:
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
}
答案 0 :(得分:7)
实现这一目标的最佳方法是使用构造函数的默认参数
class Child(id: Int = -1, name: String? = null) : Parent(id, name)
取决于您对Parent
课程的影响程度,甚至可能
class Parent(val id: Int = -1, val name: String? = null)
这有一个“缺点”:你在技术上会得到三个不同的构造函数。但我无法看到这可能是一个问题,因为无论如何你必须处理id=-1
和name=null
个案。
此外,我不认为你的解决方案
class Child(id: Int, name: String?) : Parent(id, name) {
constructor() : this(-1, null)
}
以任何方式都是坏的或“多余的” - 恰恰相反:它具有高度的表现力和明确性,所以读者确切知道你的意图是什么。
答案 1 :(得分:4)
首先,您不能扩展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);
}