You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:08:13