[kotlin系列] (s2_3)扩展、数据类、密封类

时间:2021-11-23 05:37:00

扩展译文见这里

kotlin支持扩展函数和扩展属性。

扩展静态解析的

  • 扩展不会真正的插入成员。
  • 扩展函数是由函数调用的表达式的类型决定的。(而不是类实例)
  • 在函数模型上“一模一样”的成员函数和扩展函数,永远使用成员函数

注意可以为可空的箱体定义扩展函数

扩展属性

注意:扩展属性不能有初始化器,其行为只能有显示提供的Getter/Setter定义。

关于扩展声明为成员

能别瞎扩展就别瞎扩展
扩展函数能访问被扩展类(其实例为扩展接收者?)的成员函数、也可以访问编写扩展的类(其实例为分发接收者?)的成员函数。

当重名时,优先访问扩展接收者,访问分发接收者使用this语法


数据类

数据类译文见这里

虽然按照之前类声明章节,声明一个数据类已经很简单了,配合主构造函数几乎没有啥代码量

kotlin中还可以使用data关键字定义声明数据类:

data class User(val name: String, val age: Int)

可以自动推导出:

  • equals()/hashCode() 对,
  • toString() 格式是 “User(name=John, age=42)”,
  • componentN() 函数 按声明顺序对应于所有属性,
  • copy() 函数。

密封类

密封类用来表示受限的类继承结构:当一个值为有限集中的类型、而不能有任何其他类型时。在某种意义上,他们是枚举类的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例。

关键字:sealed

详情见这里

可以看看demo,这个还是有用的。