Kotlin 中字段的“open”关键字是啥? [复制]
Posted
技术标签:
【中文标题】Kotlin 中字段的“open”关键字是啥? [复制]【英文标题】:what is `open` keyword for fields in Kotlin? [duplicate]Kotlin 中字段的“open”关键字是什么? [复制] 【发布时间】:2018-08-11 01:57:05 【问题描述】:在 Kotlin 中,open
与 Java 中的 final
中的类和方法相同。
对于标记为open
的字段,open
在以下课程中为我提供了什么?
@MappedSuperclass
abstract class BaseEntity() : Persistable<Long>
open var id: Long? = null
更新 这不是 What is the difference between 'open' and 'public' in Kotlin? 的重复项
我对属性的 open
关键字感兴趣
更新
open
类可以被继承。open
fun 可以被覆盖val
属性是final
java 中的字段
open
属性呢?
【问题讨论】:
@s1m0nw1 它不重复我很好奇open
字段关键字
只是一个观察 - 我对 Kotlin 一无所知,所以我投弃权票。但是,如果您可以提供一个 Minimal, Complete, and Verifiable example 来展示它与属性的用法(不要只是在原始问题中添加“更新”,而是将 whole 问题更改为专门关于开放与非开放属性的问题),这个可能会被重新打开,因为另一个问题似乎没有解决它。请务必在问题中保留“这不是欺骗”文本和链接。
字段的 open 关键字允许稍后更改字段的可见性/内容,但仍保持相同的名称:open class Container protected open val fieldA: String = "Some value" class DerivedContainer : Container() public override val fieldA: String = "Something else"
这个问题与 open 和 public 的区别有何重复?
我觉得在这里提一下很重要,Kotlin 中没有“字段”这样的东西。 Kotlin 具有属性。这是 val 的 getter 方法和类中定义的 var 的 getter 和 setter 方法。即使他们在后台有一个支持字段,我们也不应该为此烦恼。既然提到了这一点,properties 的“open”关键字应该更有意义,因为它只是说明生成的 get/set 方法不是最终的,而是开放的以供覆盖。
【参考方案1】:
Java 中的final 方法:不能被覆盖的方法。
Java 中的final 类:不能扩展的类。
Kotlin 中的开放类和方法等价于 Java 中的 final,开放方法是可重写的,而开放类在 Kotlin 中是可扩展的。
【讨论】:
更新问题 开放属性必须是 Java 中的非最终字段 在不使用 java 引用的情况下定义open
可能不会那么混乱,特别是因为您的回答似乎忽略了这个保留字的微妙之处。【参考方案2】:
正如您所说,open
关键字允许您在类声明中使用时覆盖类。因此,将属性声明为open
,允许子类覆盖属性本身(例如,重新定义 getter/setter)。该关键字是必需的,因为在 Kotlin 中,默认情况下所有内容都是“final
”,这意味着您不能 override
它(类似于 C#,如果您有这方面的经验)。
请注意,您的类被隐式声明为open
,因为它是abstract
,因此您不能直接创建该类的实例。
【讨论】:
我不明白该类是如何隐式声明为开放的,因为它是抽象的东西...... @kevzabstract
表示您不能创建该类的实例,但您必须先对其进行子类化。因此,将类标记为abstract
意味着该类也是open
(否则您将无法对其进行子类化)。示例:abstract class Shape
不能直接实例化,但可以创建和实例化子类(例如 Triangle
、Rectangle
、...)以上是关于Kotlin 中字段的“open”关键字是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin类的继承 ① ( 使用 open 关键字开启类的继承 | 使用 open 关键字开启方法重写 )
Kotlin类的继承 ① ( 使用 open 关键字开启类的继承 | 使用 open 关键字开启方法重写 )