【问题标题】:Does Kotlin Support Member Sealed Overrides?Kotlin 是否支持成员密封覆盖?
【发布时间】:2021-07-13 19:57:20
【问题描述】:

在 Kotlin 中,我们可以使用 sealed 修饰符来修改一个类,表示该类只能在同一个模块内扩展;或来自docs

密封的类和接口表示受限制的类层次结构,可提供对继承的更多控制。密封类的所有子类在编译时都是已知的。带有密封类的模块编译后不能出现其他子类。例如,第三方客户端无法在其代码中扩展您的密封类。因此,密封类的每个实例都有一个来自有限集合的类型,该类型在编译此类时是已知的。

我想知道的是,相同或相似的行为是否可以应用于班级成员;例如,考虑以下代码。所有的类和接口都存在于同一个模块中:

// I don't want to seal this because it should be implementable beyond this module.
interface Hashable {
    val hash: Hash
}

// I don't want to seal this because it should be extensible beyond this module.
abstract class Base : Hashable {
    final override val hash: Hash get() = hashOf(...)
}

open class Derived : Base {

    // This doesn't work because it's final in the base class.
    final override val hash: Hash get() = hashOf(...)
}

我本质上想要表达的是,“我(开发人员)确定Base 应该如何创建它的哈希值,直到我(开发人员)在派生类中声明否则。此模块之外的任何其他人都没有能力改变Base 的每个扩展或派生如何创建其哈希。”

这可能吗?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    您可以使用internal 可见性创建其他属性:

    abstract class Base : Hashable {
        final override val hash: Hash get() = _hash
        internal open val _hash: Hash get() = hashOf(...)
    }
    
    open class Derived : Base() {
        override val _hash: Hash get() = hashOf(...)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多