kotlin - 访问已声明对象类型的子类的属性

标签 kotlin

我有以下抽象类:

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,然后访问相应的FantasyBookPrivateDataFantasyBookPublicData变量?

希望我能很好地描述我的问题,并在此先感谢您的帮助!

最佳答案

您描述的是一个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/

相关文章:

java - 不使用maven或gradle安装框架

android - 工具栏在导航 View 中为自定义主题创建问题?

java - 通过派生类访问Java中定义的静态内部类

kotlin - Kotlin 对 JPA 静态元模型的支持

c# - Kotlin 相当于 C# 事件

kotlin - 在 Kotlin 中使用相同的 try-catch 包装所有内部方法

kotlin - 如何撰写以下Kotlin契约(Contract)?

kotlin - 在 Kotlin 中,是否通过标准库支持栈、队列、堆、树等数据结构?

date - Gson setDateFormat 在日期为空时抛出异常

java - 打印源文件的当前内容(在 Android 上使用 Java 或 Kotlin)