Kotlin接口属性限制技术咨询:反例、set访问器及实现类影响
关于Kotlin接口属性的常见疑问解答
1. 反例:尝试在接口访问器中引用幕后字段
接口内声明的属性确实无法拥有幕后字段,若强行在接口的访问器中引用field(幕后字段关键字),会直接触发编译错误,示例代码如下:
interface TestInterface { var name: String get() = field // 编译报错:接口属性不允许引用幕后字段 set(value) { field = value } // 同样编译报错 }
这段代码就是违反规则的典型反例,因为接口属性没有对应的幕后字段存储空间,field关键字在这里没有可指向的对象。
2. 接口中的属性可以拥有set访问器吗?
当然可以!只是不能依赖幕后字段实现set逻辑。你可以通过外部数据源、委托属性等方式实现合法的set访问器:
// 基于外部数据源实现访问器 interface TestInterface { var count: Int get() = ExternalCounter.get() set(value) { ExternalCounter.update(value) } } // 基于委托属性实现 interface TestInterface { var name: String by Delegates.notNull() }
只要不直接使用field关键字,接口内的set访问器完全可以正常工作。
3. 该限制是否适用于实现类?
完全不适用!实现类中的属性和普通类属性规则一致,可正常拥有幕后字段,且能在访问器中自由引用field:
interface TestInterface { var name: String } class TestImpl : TestInterface { override var name: String = "" get() = field.uppercase() // 合法引用幕后字段 set(value) { field = value.trim() } // 合法修改幕后字段 }
实现类不受接口的这个限制,可按照常规类属性的写法实现访问器逻辑。
内容的提问来源于stack exchange,提问作者Dream
相关产品推荐
相关产品推荐

