2015-05-03 32 views
8

Sto imparando Scala lavorando gli esercizi del libro "Scala per gli impazienti". Un esercizio che chiede:Qual è l'implicazione delle parole chiave protette nella definizione della classe in Scala?

Il file contiene la definizione Stack.scalaclass Stack[+A] protected (protected val elems: List[A])

Spiegate il significato delle parole chiave protected.

Qualcuno può aiutarmi a capire questo? protected ha ovviamente senso per le variabili membro, ma quale implicazione ha in una definizione di classe?

risposta

6

In Scala, scrivendo

class Stack[+A](elems: List[A]) 

implementa anche un costruttore di default. Se si conosce Java, quindi in Java questo sarebbe qualcosa di simile

class Stack<A> { 
    private List<A> elems; 
    public Stack<A>(List<A> elems){this.elems = elems;} 
} 

Ora, avete due protected parole chiave nel tuo esempio:

  • protected val elems: List[A]
  • protected (/*...*/)

La prima rende la variabile elems protetta, il che significa che è accessibile (e in ombra) solo per sottoclassi di Stack[+A].

Il secondo rende il costruttore protetto, ovvero una nuova istanza Stack può essere creata solo da sottoclassi di Stack[+A].

Anche in questo caso, il codice Java equivalente sarebbe qualcosa di simile

class Stack<A> { 
    protected List<A> elems; 
    protected Stack<A>(List<A> elems){this.elems = elems;} 
} 
+0

Grazie! Qual è il significato di '+ A'? –

+1

Significa che 'Stack' è covariante nel parametro generico' A', nel senso che 'Stack [Dog]' è un 'Stack [Animale]'. Se non si aggiunge il segno più, allora l'assegnazione 'val x: Stack [Animale] = Stack [Cane] (Cane (" Pluto "))' è illegale. –

+0

Sì in Java, 'Elenco ' non è 'Lista '. Quindi la contravarianza è '-A' allora? Se è così, immagino che si possa scrivere 'class Stack [+ A] (elems: List [-A])'? –