“公共只读”访问修饰符?

Posted

技术标签:

【中文标题】“公共只读”访问修饰符?【英文标题】:"public read-only" access modifier? 【发布时间】:2019-07-15 09:52:57 【问题描述】:

“传统”实现:

interface IFoo
    fun getS():String
    fun modifyS():Unit


class Foo : IFoo
    private var s = "bar"

    override fun getS() = s.toUpperCase()
    override fun modifyS() s = when(s)
        "bar" -> "baz"
        else -> "bar"
    

我现在想要的是这样的:

interface IFoo
    var s:String
        protected set

    fun modifyS():Unit


class Foo : IFoo
    override var s = "bar"
        protected set
        get() = field.toUpperCase()

    override fun modifyS() s = when(s)
        "bar" -> "baz"
        else -> "bar"
    

我有一种预感,答案是否定的,但是……

有什么办法可以做到这一点?

【问题讨论】:

【参考方案1】:

无法将接口成员的可见性限制为protected

但是,您可以在接口中定义val,在实现中定义override it with a var

interface IFoo 
    val s: String


class Foo : IFoo 
    override var s = "bar"
        protected set
        get() = field.toUpperCase()

【讨论】:

以上是关于“公共只读”访问修饰符?的主要内容,如果未能解决你的问题,请参考以下文章

访问修饰符

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

Java_修饰符详解

在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?

Java中成员属性默认访问修饰符是啥

比类访问修饰符限制更少的成员访问修饰符有啥用?