mi è capitato di scoprire che non è permesso avere campi privati astratti in un tratto, cioè,astratti campi privati a Scala tratto
trait A1 {
//private val a: Int // Not allowed
protected val b: Int // OK
}
e sembra tutto a posto per fare cosa simile ad una classe astratta , se i campi privati sono parametri del costruttore, cioè,
abstract class A2 (private val i: Int) // OK
quindi credo che un tratto non ha parametri del costruttore, quindi non c'è modo per inizializzare loro, quindi non fie privato astratto lds sono ammessi.
Se sono "protetti", una sottoclasse può inizializzarli utilizzando i campi pre-inizializzati . Questo approccio consente alla sottoclasse di vedere questi campi.
E se volessi inizializzarli e nasconderli in seguito, come nell'esempio seguente?
object holding {
trait trick {
protected val seed: Int // Can't be private
final def magic: Int = seed + 123
}
trait new_trick extends trick {
def new_magic: Int = magic + 456
def the_seed: Int = seed // [1]
}
def play: new_trick = new { val seed = 1 } with new_trick
def show_seed(t: new_trick): Int = t.the_seed // [2]
}
Io Non voglia a chiunque di essere in grado di vedere seme, cioè, [2] (e quindi [1]) non dovrebbe essere consentito. C'è un modo per un tratto per farlo?
Come @Randall e @ pagoda_5b hanno fatto notare, la mia domanda non ha molto senso . Ma fortunatamente @ Régis e @ axel22 l'hanno trasformato in un'altra interessante domanda e fornito un modello per risolverlo.
Come può essere significativo avere qualcosa di privato e non implementato? È una contraddizione, dal momento che non è ereditata e non può mai essere implementata e quindi impedirebbe l'istanziazione di qualsiasi sottotipo del tratto che porta tale membro. –
Non sono sicuro di seguirti. Se hai bisogno di sottoclassi per definire il seme (ignorando la sua definizione), non ha senso renderlo privato. Detto questo, la sottoclasse che definisce l'implementazione del membro di seed sarà sempre in grado di mostrarla con un accesso pubblico. Non riesco a capire la necessità di questa scelta progettuale. –
Penso che si riduca ad essere in grado di lasciare che il sub-tratto diretto definisca il valore di 'seed' mentre rende ulteriori sotto-tratti (e codice esterno) non in grado di accedere al valore. Un po 'come un valore protetto (trattare come un valore protetto per i sotto-tratti e trattare come privato per qualsiasi cosa). Per quanto riguarda la significatività, penso che l'idea sia solo quella di emulare completamente ciò che può essere fatto attraverso i parametri (nelle classi) come mostrato nel suo esempio. –