Вернуть разные типы объектов из уже существующих классов в kotlin - PullRequest
0 голосов
/ 02 февраля 2019

Я работаю с методом, который возвращает различные виды объектов, и я использую тип Any для достижения этой цели.

метод выглядит следующим образом:

 override fun presentNativeItem(dcsItem: DCSItem): Any {
        var type = dcsItem?.type?.toUpperCase()
        return when (type) {
            DSCType.NAVMENU.name -> buildNavMenu(dcsItem)
            DSCType.NAVLINK.name -> buildNavLink(dcsItem)
            DSCType.IMAGE.name -> buildImage(dcsItem)
            else -> throw IllegalStateException("Unknown Type ${dcsItem?.type} of NavItem")
        }
    }

Модельклассы похожи на:

abstract class NavItem {
    abstract val attributes: String
    abstract val text: String
    abstract val hasChildren: Boolean
    abstract val childrenIds: List<Int>?
    abstract val items: List<NavItem>?
    abstract val hasImages: Boolean
    abstract val image: String?
}

data class NavMenu(override val items: List<NavItem>?,
                   override var image: String?,
                   override val attributes: String,
                   override val text: String,
                   override val hasChildren: Boolean,
                   override val childrenIds: List<Int>?,
                   override val hasImages: Boolean) : NavItem()

data class NavLink(override val items: List<NavItem>?,
                   val shortText: String?,
                   override var image: String?,
                   override val attributes: String,
                   override val text: String,
                   override val hasChildren: Boolean,
                   override val childrenIds: List<Int>?,
                   override val hasImages: Boolean) : NavItem()

И, наконец, я использую этот метод следующим образом:

override fun getNavItemById(dCSServiceContext: DCSServiceContext): Single<Any> {
    return scribeProvider.getNavItemById(dCSServiceContext).map { navItem ->
        scribePresenter.presentNativeItem(navItem)
    }
}

Я читал о запечатанных классах, но вы должны создать классы сконструктор внутри запечатанных классов, у меня есть эта модель, которую я не могу изменить, потому что она используется в нескольких местах.

Есть идеи?

Спасибо!

1 Ответ

0 голосов
/ 02 февраля 2019

Оберните различные типы возвращаемых данных в иерархию запечатанных классов и верните NativeItem из вашей функции:

sealed class NativeItem
class NavMenuItem(val menu: NavMenu) : NativeItem()
class NavLinkItem(val link: NavLink) : NativeItem()
class ImageItem(val image: Image) : NativeItem()
...