簡體   English   中英

Kotlin 是否支持成員密封覆蓋?

[英]Does Kotlin Support Member Sealed Overrides?

在 Kotlin 中,我們可以用sealed修飾符修改一個類,表示該類只能在同一個模塊內擴展; 或來自文檔

密封類和接口表示受限制的類層次結構,提供對繼承的更多控制。 密封類的所有子類在編譯時都是已知的。 編譯帶有密封類的模塊后,不得再出現其他子類。 例如,第三方客戶無法在他們的代碼中擴展您的密封類。 因此,密封類的每個實例都有一個來自有限集合的類型,該集合在編譯此類時是已知的。

我想知道的是,相同或相似的行為是否可以應用於班級成員; 例如,考慮以下代碼。 所有的類和接口都存在於同一個模塊中:

// 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衍生物可能會創建其哈希值。”

這可能嗎?

您可以創建具有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(...)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM