Kotlin:子构造函数如何使用其父构造函数的辅助构造函数?
Posted
技术标签:
【中文标题】Kotlin:子构造函数如何使用其父构造函数的辅助构造函数?【英文标题】:Kotlin: How can a child constructor use its parent's secondary constructor? 【发布时间】:2017-06-27 05:40:55 【问题描述】:例如,我们有这个父级:
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
【问题讨论】:
请添加您收到的错误消息 【参考方案1】:实现这一点的最佳方法是恕我直言,为您的构造函数使用 默认参数
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)
在任何方面都不好,或“多余” - 相反:它具有高度的表现力和明确性,因此读者确切地知道您的意图是什么。
【讨论】:
【参考方案2】:首先,您不能扩展 Parent
类,因为它不是 open
ed。
其次,如果一个类已经声明了主构造函数,则不能通过super
关键字调用超类的构造函数。
另一方面,如果你想通过关键字super
调用superlcas的构造函数。您需要将主构造函数设置为辅助构造函数,例如:
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);
【讨论】:
以上是关于Kotlin:子构造函数如何使用其父构造函数的辅助构造函数?的主要内容,如果未能解决你的问题,请参考以下文章
kotlin:sceondary构造函数中的“未解析的引用”
如何在 Kotlin Android 中为数据类创建空构造函数
Kotlin类与对象 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )