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=-1name=null 的情况。

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

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

在任何方面都不好,或“多余” - 相反:它具有高度的表现力和明确性,因此读者确切地知道您的意图是什么。

【讨论】:

【参考方案2】:

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

其次,如果一个类已经声明了主构造函数,则不能通过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:子构造函数如何使用其父构造函数的辅助构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 PHP 类构造函数调用其父级的父级构造函数?

kotlin:sceondary构造函数中的“未解析的引用”

如何使用 Kotlin 创建自定义视图的构造函数

如何在 Kotlin Android 中为数据类创建空构造函数

Kotlin类与对象 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

Kotlin:'这种类型有一个构造函数,因此必须在这里初始化',但没有声明构造函数