2010-03-08 8 views

Respuesta

151

constructores La sobrecarga no es especial para las clases de casos:

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

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

Sin embargo, puede que quiera sobrecargar también el método apply en el objeto acompañante, que se llama cuando se omite new.

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

Foo(1, 2) 
Foo(1) 

En Scala 2.8, de nombre y los parámetros por defecto a menudo se puede utilizar en lugar de la sobrecarga.

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

muy agradable :) normal, yo estaba buscando algo así como valores de retorno en Scala, que es nueva de 2,8? No sabía :) – Felix

+0

Sí, los parámetros Nombre y Por defecto son nuevos en Scala 2.8. – retronym

+7

Martin Odersky explica por qué los métodos adicionales de aplicación no se agregan automáticamente: http://www.scala-lang.org/node/976 –

17

Puede definir un constructor sobrecargado de la manera habitual, pero para invocarlo debe utilizar la palabra clave "nueva".

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

Eso no es del todo cierto - se puede declarar que en el objeto acompañante como –

Cuestiones relacionadas