2012-06-22 8 views
40

esiste un modo per estendere una classe di casi senza dover continuamente raccogliere nuovi valori lungo la strada? Per esempio, questo non funzionaEstendere la classe caso scala senza duplicare costantemente i valori dei costruttori?

case class Edge(a:Strl, b:Strl) 
case class EdgeQA(a:Strl, b:Strl, right:Int, asked:Int) extends Edge(a,b) 

"a" è in conflitto con "a", quindi sono costretto a rinominare in A1. Ma non voglio tutti i tipi di copie extra pubbliche di "a", quindi l'ho reso privato.

Questo proprio non mi sembra pulito .. mi manca qualcosa?

risposta

46

Come il precedente commentatore ha menzionato: l'estensione della classe del case dovrebbe essere evitata ma è possibile convertire la classe Edge in un tratto.

Se si vuole evitare le dichiarazioni private è anche possibile contrassegnare le variabili come di override

trait Edge{ 
    def a:Strl 
    def b:Strl 
} 

case class EdgeQA(override val a:Strl, override val b:Strl, right:Int, asked:Int) extends Edge 

Non dimenticare di preferire def oltre val a tratti

+7

Abbiamo perso il vantaggio di Edge come classe standalone: ​​prima che potesse essere istanziato e avesse l'oggetto Metodi di fabbrica – javadba

+1

ma ho ancora bisogno di ridichiarare a eb. Cosa succede se il carattere ha un valore predefinito per ae be e desidero utilizzare questi valori stessi. – Sohaib

+5

Puoi spiegare perché la def è preferita nei tratti? – Wolfsblvt

11

Le classi di casi non possono essere estese tramite sottoclasse. O meglio, la sottoclasse di una case class non può essere una case case stessa.

+3

Osare spiegare perché? –

+2

Allora perché ci sono 'case class finali? Il 'final' _LocalModifier_ è ciò che impedisce l'estensione di una' case class', non qualche altra proibizione della lingua. Vedere §5.2, p.63 di [Scala Reference] (http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf) –

+3

Final impedisce di estendere una classe di case con qualsiasi cosa (ad es. e non case classes), oltre alla restrizione integrata per estendere le classi caso con le classi case. – jhegedus

23

Questa soluzione offre alcuni vantaggi rispetto al precedente soluzioni:

trait BaseEdge { 
    def a: Strl 
    def b: Strl 
} 
case class Edge(a:Strl, b:Strl) extends BaseEdge 
case class EdgeQA(a:Strl, b:Strl, right:Int, asked:Int) extends BaseEdge 

In questo modo:

  • non si dispone di ridondante val s e
  • si hanno 2 classi di casi.
+1

questo è decisamente meglio – salvob

Problemi correlati