// Created on savesnippets.com ยท https://savesnippets.com/SF1l2hy3JjICeM sealed interface Loadable { val isLoading: Boolean } sealed interface Cacheable { val cachedAt: Long? } // Data classes can implement BOTH sealed interfaces simultaneously data class FreshData( val payload: String, override val isLoading: Boolean = false, override val cachedAt: Long? = null, ) : Loadable, Cacheable data class StaleData( val payload: String, override val isLoading: Boolean = false, override val cachedAt: Long, // required ) : Loadable, Cacheable fun displayLabel(d: Loadable): String = when (d) { is FreshData -> "fresh: ${d.payload}" is StaleData -> "stale (cached ${d.cachedAt}): ${d.payload}" } fun main() { println(displayLabel(FreshData("hi"))) println(displayLabel(StaleData("hi", cachedAt = 12345L))) }