【发布时间】: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