Si noti che la mia domanda non è specifica per piattaforma, ecco perché non aggiungo il tag [kotlin] (il codice è in Kotlin). Se c'è una risposta specifica per Kotlin, mi piacerebbe sentirla anche se
Sto lavorando su una libreria a componenti semplici (GUI) e ho le seguenti interfacce:
interface Component : Drawable, Positionable, Identifiable {
fun getComponentStyles() : ComponentStyles
fun setComponentStyles(componentStyles: ComponentStyles)
}
interface Container : Component {
fun addComponent(component: Component)
}
Internamente ho alcune classi base che implementano la funzionalità comune ( DefaultComponent
e DefaultContainer
). Il mio problema è che ho alcuni metodi che non vorrei esporre al mondo esterno come:
fun fetchComponentByPosition(position: Position): Optional<out Component>
Posso usare DefaultComponent
internamente ma il problema è che l'utente è in grado di chiamare addComponent
che aggiungerà un Component
a un Container
e ovviamente un Component
non è un DefaultComponent
. Posso creare un altro interface
implementato da DefaultComponent
ma non risolverà il problema che è invariance qui.
Attualmente ho Builder
s per tutto Components
e tutte le implementazioni Component
usano DefaultComponent
come una classe base, quindi posso lanciare Component
in DefaultComponent
salfey ma questo è un trucco al meglio.
Quindi la mia domanda è questa: come posso nascondere l'API interna quando devo usare le interfacce invariant (per invariante intendo che entrambi restituisco e accetto le classi con uno specifico interface
e non posso declassarli in modo sicuro).?