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).?