2010-03-08 5 views

Répondre

151

constructeurs ne sont pas particulièrement Surcharger pour les classes de cas:

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

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

Cependant, vous pouvez vous surcharger également la méthode apply dans l'objet compagnon, qui est appelée lorsque vous omettez new.

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

Foo(1, 2) 
Foo(1) 

Scala 2.8, du nom et des paramètres par défaut peuvent souvent être utilisées au lieu de surcharge.

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

normale Very nice :) Je cherchais quelque chose comme valeurs de repli dans scala, est-il nouveau de 2,8? Je ne savais pas :) – Felix

+0

Oui, les paramètres Named et Default sont nouveaux dans Scala 2.8. – retronym

+7

Martin Odersky explique pourquoi les méthodes add apply ne sont pas ajoutées automatiquement: http://www.scala-lang.org/node/976 –

17

Vous pouvez définir un constructeur surchargé de la manière habituelle, mais pour l'invoquer, vous devez utiliser le mot-clé "new".

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

Ce n'est pas strictement vrai - vous pouvez le déclarer dans l'objet compagnon comme –

Questions connexes