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,因此您不能直接创建该类的实例。

【讨论】:

我不明白该类是如何隐式声明为开放的,因为它是抽象的东西...... @kevz abstract 表示您不能创建该类的实例,但您必须先对其进行子类化。因此,将类标记为abstract 意味着该类也是open(否则您将无法对其进行子类化)。示例:abstract class Shape 不能直接实例化,但可以创建和实例化子类(例如 TriangleRectangle、...)

以上是关于Kotlin 中字段的“open”关键字是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin类的继承 ① ( 使用 open 关键字开启类的继承 | 使用 open 关键字开启方法重写 )

Kotlin类的继承 ① ( 使用 open 关键字开启类的继承 | 使用 open 关键字开启方法重写 )

Kotlin open关键字的使用

kotlin 中的 out 关键字是啥

Kotlin基础(十五) 关键字:openfinal和abstract(抽象类)

Kotlin中接口抽象类泛型out(协变)in(逆变)reified关键字的详解