我有以下抽象类:
abstract class AbstractBook {
abstract val type: String
abstract val privateData: Any
abstract val publicData: Any
}
下面的类继承了AbstactBook类:
data class FantasyBook (
override val type: String = "FANTASY",
override val privateData: FantasyBookPrivateData,
override val publicData: FantasyBookPublicData
) : AbstractBook()
然后是此类,其中应包括来自任何类型的AbstractBook的数据:
data class BookState(
val owner: String,
val bookData: AbstractBook,
val status: String
)
如果我有一个
BookState
实例,如何检查它是Book的哪个type
,然后访问相应的FantasyBookPrivateData
和FantasyBookPublicData
变量?希望我能很好地描述我的问题,并在此先感谢您的帮助!
最佳答案
您描述的是一个sealed class
:
sealed class Book<T, K> {
abstract val type: String
abstract val privateData: T
abstract val publicData: K
data class FantasyBook(
override val type: String = "FANTASY",
override val privateData: String,
override val publicData: Int) : Book<String, Int>()
}
在
data class
中,您可以像这样进行模式匹配:data class BookState(
val owner: String,
val bookData: Book<out Any, out Any>,
val status: String) {
init {
when(bookData) {
is Book.FantasyBook -> {
val privateData: String = bookData.privateData
}
}
}
}
以类型安全的方式访问您的数据。由于您在类本身中拥有该信息,因此该解决方案还使
type
变得多余。我同意@Marko Topolnik的观点,这似乎是一种代码味道,因此您可能需要重新考虑您的设计。
关于kotlin - 访问已声明对象类型的子类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52756751/