Come creare una API "interna" per la mia libreria che non è esposta all'utente?

1

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

    
posta Adam Arold 24.08.2017 - 15:12
fonte

0 risposte