如何在Kotlin中实现含抽象setter与已实现getter的属性?
纯Kotlin实现“抽象Setter+已实现Getter”的属性方案
你想要的这种“Getter固定实现、Setter由子类自定义”的属性,纯Kotlin有两种简洁的实现方式,完全不需要依赖Java:
方案一:抽象类结合抽象Setter
直接在抽象类中定义var属性,实现Getter逻辑,同时将Setter标记为abstract,强制子类实现:
abstract class MyType { abstract val complexObject: ComplexObject var myProperty: String // 固定实现Getter,复用complexObject的逻辑 get() = complexObject.someDerivationLogic // 标记Setter为抽象,子类必须实现 abstract set(value) }
子类实现时,只需要完成Setter的逻辑即可,Getter可以直接复用父类的实现:
class MyImpl(override val complexObject: ComplexObject) : MyType() { override var myProperty: String get() = super.myProperty // 可选:直接复用父类Getter set(value) { // 自定义Setter逻辑,比如修改complexObject的内部状态 complexObject.someProperty = value } }
方案二:Kotlin接口结合默认Getter
Kotlin 1.4+支持接口中给属性的访问器添加默认实现,我们可以利用这一点,在接口中定义带默认Getter的var属性,Setter留空让实现类自定义:
interface MyType { val complexObject: ComplexObject var myProperty: String // 默认实现Getter逻辑 get() = complexObject.someDerivationLogic // Setter为抽象,由实现类实现 set(value) }
子类实现示例:
class MyImpl(override val complexObject: ComplexObject) : MyType { override var myProperty: String get() = super.myProperty set(value) { // 自定义Setter逻辑 complexObject.someProperty = value } }
原代码编译失败的原因
你最初的写法无法编译,是因为Kotlin中abstract var的语法规则:如果声明了abstract var,意味着所有访问器(Getter和Setter)都是抽象的,不能单独给其中一个访问器添加实现。必须把var声明为非抽象,再单独将需要自定义的Setter标记为abstract。
两种方案都支持直接使用属性语法myType.myProperty来读写,完全符合Kotlin的风格。
内容的提问来源于stack exchange,提问作者The Beruriah Incident
相关产品推荐
相关产品推荐

