Ricerca…


Sintassi

  • trait Type {selfId => / altri membri possono fare riferimento a selfId nel caso in cui this significhi qualcosa /}
  • trait Type {selfId: OtherType => / * altri membri possono usare selfId e sarà di tipo OtherType * /
  • tratto Tipo {selfId: OtherType1 con OtherType2 => / * selfId è di tipo OtherType1 e OtherType2 * /

Osservazioni

Spesso usato con il motivo a torta.

Semplice esempio di auto-tipo

I tipi di auto possono essere usati in tratti e classi per definire i vincoli sulle classi concrete con cui è mescolato. È anche possibile utilizzare un identificatore diverso per this usando questa sintassi (utile quando l'oggetto esterno deve essere referenziato da un oggetto interno).

Supponi di voler memorizzare alcuni oggetti. Per questo, si creano interfacce per lo storage e si aggiungono valori a un contenitore:

 trait Container[+T] {
   def add(o: T): Unit
 }

 trait PermanentStorage[T] {
   /* Constraint on self type: it should be Container
    * we can refer to that type as `identifier`, usually `this` or `self`
    * or the type's name is used. */
   identifier: Container[T] =>

   def save(o: T): Unit = {
     identifier.add(o)
     //Do something to persist too.
   }
 }

In questo modo quelli non si trovano nella stessa gerarchia di oggetti, ma PermanentStorage non può essere implementato senza implementare anche Container .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow