【问题标题】:Understanding secondary constructor in Kotlin了解 Kotlin 中的二级构造函数
【发布时间】:2019-08-07 21:54:35
【问题描述】:

我不明白this 的用法以及如何创建对象或调用构造函数以及下面的代码中发生了什么。

class Person {
    var children: MutableList<Person> = mutableListOf<Person>();
    constructor(parent: Person) {
        parent.children.add(this)
    }
}

class Person(val name: String) {
    var children: MutableList<Person> = mutableListOf<Person>();
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

来源:https://kotlinlang.org/docs/reference/classes.html

【问题讨论】:

  • 那么...您对链接页面上的解释有什么不明白的地方?
  • 当你创建 Person A 时,是否必须将另一个 Person B 对象传递给 Person A 构造函数。 parent.children.add(this) 做什么?你能给我举一个对象是如何创建的例子吗?
  • 如果您调用辅助构造函数,是的,因为它需要一个 Person 作为参数。 parent.children.add(this) 添加当前对象,正在构造(this)到作为参数传递的父 person 的孩子。示例:val francis = Person("Francis Ford Coppola") val sofia = Person(name = "Sofia Coppola", parent = francis)。之后,franciis 的孩子列表中包含 sofia。
  • 那是因为您正在尝试使用 Person 的第一个版本,它没有带名称的主构造函数。使用第二个。

标签: kotlin


【解决方案1】:

: this(...) 调用意味着调用另一个构造函数,所以每个对象也是用主构造函数构造的。

class Person /* a */ (val name: String) {
    var children: MutableList<Person> = mutableListOf<Person>();
    /* b */ constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

在本例中,a 后面有主构造函数,b 后面有辅助构造函数,所以有两种方法可以实例化这个类。

  1. 调用主构造函数:Person("abc")
  2. 调用二级构造函数:Person("abc", Person("dfg")),保证主二级构造函数都会被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多