Proposal: abstract class implementing sealed interface, relaxing the rules

Note you can do this:

// module 1

interface BaseAnimal {
    val name: String
}

sealed interface Animal : BaseAnimal

// module 2
abstract class MyAnimal internal constructor() : BaseAnimal { ... }

data class MyCat(override val name: String) : MyAnimal(), Cat { ... }

Not ideal, but works.

2 Likes