一、属性的继承
1、属性和函数类似也是可以继承
interface Parent { val addr: String // 这里是接口所以默认是open,如果是普通类中要被继承则需要显示写open } class Child: Parent { override val addr: String = "addr" // 这里使用override的方式 }
2、接口中的属性也可以有get和set,前提是不支持字段(支持字段需要在接口中存储状态)
interface User { var email: String var nickname: String get() = email.substringBefore('@') // 这里通过获取email的子字符串的方式 set(value: String) { email = value // 这里没有涉及到field // field = value // error: property in an interface cannot have a backing field } }
在接口中操作属性,不能涉及到field的操作
二、属性的get和set的作用
1、通过get和set方法增加额外的操作
class User(val name: String) { var addr: String? = null set(value: String?) { println("addr changed $field -> $value") // 这里增加打印的日志 field = value } get() { if (field == null) { addr = "unspec" // 这里给个默认值 } return field } }
如上的例子在get和set中增加了额外的操作
2、修改属性访问的权限
有时候在类中,希望属性的get是public但是set是private
class User { var count = 0 private set // 这里对set增加private的修饰,则只允许在类中赋值,但是get没有做操作则默认是public }