Kotlin数据类包含开放函数

时间:2017-12-11 18:18:07

标签: kotlin kotlin-android-extensions

我正在阅读kotlin官方教程,在data class topic下,我提出了以下观点。

  

如果超类型具有打开的componentN()函数并返回兼容类型,则会为数据类生成相应的函数并覆盖超类型的函数。如果由于签名不兼容或最终导致超类型的功能无法被覆盖,则会报告错误;

我的问题是,

1)什么是componentN()函数?

2)数据类是否自动覆盖open函数?

3)以下代码是否正确?

open class SuperDataClass {

  open fun componentN() {
     println("from super class")
  }
}

data class DataClassExample (var name: String): SuperDataClass() {
  //
}

1 个答案:

答案 0 :(得分:0)

  

1)什么是componentN()函数?

它们是与声明顺序对应的属性的运算符函数。

示例:

 data class Person(name: String, age: Int)

上述课程将设有component1component2功能,允许access through destructuring declaration按此顺序命名和年龄。
考虑到componentN函数仅用于引用第1,第2,第3,......,第N个组件。永远不会生成componentN函数本身。

  

2)数据类是否自动覆盖open函数?

在数据类中,您从Any类扩展,您不会自动覆盖任何函数。 componentN函数在编译时生成。

  

3)以下代码是否正确?

open class SuperDataClass {
    open fun componentN() {
        println("from super class")
    }
}

data class DataClassExample (var name: String): SuperDataClass() {
    //
}

是的,它将编译并将正确运行。但这只是因为,正如我之前所说,componentN并未为数据类生成  但是,在这种情况下,会为component1的属性name生成DataClassExample。正如您发布的文档的引用所示:如果您尝试使用此代码,则会出现错误。

open class SuperDataClass {
    open fun component1() {//<-- note this
        println("from super class")
    }
}

data class DataClassExample (var name: String): SuperDataClass() {
    //
}

具体错误是:

[DATA_CLASS_OVERRIDE_CONFLICT] Function 'component1' generated for the data class conflicts with member of supertype 'SuperDataClass'