2010-03-08 10 views

risposta

151

costruttori Sovraccarico non è speciale per le classi di casi:

case class Foo(bar: Int, baz: Int) { 
    def this(bar: Int) = this(bar, 0) 
} 

new Foo(1, 2) 
new Foo(1) 

Tuttavia, come si può sovraccaricare anche il metodo apply nell'oggetto compagno, che viene chiamato quando si omette new.

object Foo { 
    def apply(bar: Int) = new Foo(bar) 
} 

Foo(1, 2) 
Foo(1) 

In Scala 2.8, i parametri denominati e predefiniti possono essere spesso utilizzati al posto del sovraccarico.

case class Baz(bar: Int, baz: Int = 0) 
new Baz(1) 
Baz(1) 
+0

Molto bello :) Ero alla ricerca di qualcosa di simile a valori di ripristino a Scala, è di nuovo da 2,8? Non lo sapevo :) – Felix

+0

Sì, i parametri Named e Default sono nuovi in ​​Scala 2.8. – retronym

+7

Martin Odersky spiega perché i metodi di applicazione aggiuntivi non vengono aggiunti automaticamente: http://www.scala-lang.org/node/976 –

17

È possibile definire un costruttore sovraccarico nel solito modo, ma per invocarlo è necessario utilizzare la parola chiave "nuovo".

scala> case class A(i: Int) { def this(s: String) = this(s.toInt) } 
defined class A 

scala> A(1) 
res0: A = A(1) 

scala> A("2") 
<console>:8: error: type mismatch; 
found : java.lang.String("2") 
required: Int 
     A("2") 
     ^

scala> new A("2") 
res2: A = A(2) 
+2

Questo non è del tutto vero - è possibile dichiarare nell'oggetto compagna come normale –