我在寫一個標準化的宣告方式(用sealed class),但是發生了一些奇妙的情況,我不太理解
sealed class AppPreference<T>(
val key: Preferences.Key<T>,
val defaultValue: T
) {
class Str(key: Preferences.Key<String>) : AppPreference<String>(key, "")
class Bool(key: Preferences.Key<Boolean>) : AppPreference<Boolean>(key, false)
class IntPref(key: Preferences.Key<Int>) : AppPreference<Int>(key, 0)
object FINISHED_DESC : AppPreference.Bool(booleanPreferencesKey("finished_desc"))
}
我想要將這些Preference key在宣告時就有一個初始值,所以我設計了一個sealed class 含有key和default value
之後再設計了幾個比較常見的class,讓他們分別負責初始化各種型別
但是我發現我的FINISHED_DESC在這些class不是open的時候會報錯,他會顯示This type is final, so it cannot be extended
但是我理解的sealed class裡面的class皆可以直接使用,且變數可以宣告成object
我需要知道更深入的細節,雖然把class 改成open class就可以解決
抱歉打擾,我大概弄懂了
object本身只能繼承open class
而sealed class是半封閉的,對內open的class
但是在裡面宣告的class還是預設為final
所以他無法繼承,就算是在sealed class裡面