tutorial software renault fungicida examples constructora blanquerna scala

software - Sobrecarga de constructor Scala?



scala tutorial (6)

¿Cómo se proporcionan constructores sobrecargados en Scala?


A partir de Scala 2.8.0 también puede tener valores predeterminados para los parámetros de contructor y método. Me gusta esto

scala> class Foo(x:Int, y:Int = 0, z:Int=0) { | override def toString() = { "Foo(" + x + ", " + y + ", " + z + ")" } | } defined class Foo scala> new Foo(1, 2, 3) res0: Foo = Foo(1, 2, 3) scala> new Foo(4) res1: Foo = Foo(4, 0, 0)

Los parámetros con valores predeterminados deben venir después de los que no tienen valores predeterminados en la lista de parámetros.


Mientras miraba mi código, de repente me di cuenta de que había sobrecargado un constructor. Entonces recordé esa pregunta y volví para dar otra respuesta:

En Scala, no puedes sobrecargar constructores, pero puedes hacerlo con funciones.

Además, muchos optan por hacer que la función de apply de un objeto complementario sea una fábrica para la clase respectiva.

Al hacer esta clase abstracta y sobrecargar la función apply para implementar-instanciar esta clase, tiene su "constructor" sobrecargado:

abstract class Expectation[T] extends BooleanStatement { val expected: Seq[T] … } object Expectation { def apply[T](expd: T ): Expectation[T] = new Expectation[T] {val expected = List(expd)} def apply[T](expd: Seq[T]): Expectation[T] = new Expectation[T] {val expected = expd } def main(args: Array[String]): Unit = { val expectTrueness = Expectation(true) … } }

Tenga en cuenta que defino explícitamente cada apply para devolver la Expectation[T] , de lo contrario devolvería una Expectation[T]{val expected: List[T]} tipo pato Expectation[T]{val expected: List[T]} .


Pensé que podría ser Scala Constructors (11-11-2008) podría agregar más información.


Prueba esto

class A(x: Int, y: Int) { def this(x: Int) = this(x, x) def this() = this(1) override def toString() = "x=" + x + " y=" + y class B(a: Int, b: Int, c: String) { def this(str: String) = this(x, y, str) override def toString() = "x=" + x + " y=" + y + " a=" + a + " b=" + b + " c=" + c } }


Vale la pena mencionar explícitamente que los Constructores Auxiliares en Scala deben llamar a la respuesta del constructor primario (como en landon9720) u otro constructor auxiliar de la misma clase, como su primera acción. No pueden simplemente llamar al constructor de la superclase de forma explícita o implícita como lo hacen en Java. Esto asegura que el constructor primario sea el único punto de entrada a la clase.

class Foo(x: Int, y: Int, z: String) { // default y parameter to 0 def this(x: Int, z: String) = this(x, 0, z) // default x & y parameters to 0 // calls previous auxiliary constructor which calls the primary constructor def this(z: String) = this(0, z); }


class Foo(x: Int, y: Int) { def this(x: Int) = this(x, 0) // default y parameter to 0 }