Scala constructeur surcharge?

Comment fournissez-vous les constructeurs surchargés dans Scala?

Il convient de mentionner explicitement que les constructeurs auxiliaires de Scala doivent soit appeler la première réponse du constructeur primaire (comme dans landon9720), soit un autre constructeur auxiliaire de la même classe. Ils ne peuvent pas simplement appeler le constructeur de la superclasse explicitement ou implicitement comme ils peuvent le faire en Java. Cela garantit que le constructeur principal est le seul point d’entrée dans la classe.

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

A partir de Scala 2.8.0, vous pouvez également avoir des valeurs par défaut pour les parameters de constructeur et de méthode. Comme ça

 scala> class Foo(x:Int, y:Int = 0, z:Int=0) { | override def toSsortingng() = { "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) 

Les parameters avec des valeurs par défaut doivent venir après ceux avec aucune valeur par défaut dans la liste des parameters.

En regardant mon code, je me suis soudain rendu compte que je surchargeais un constructeur. Je me suis alors souvenu de cette question et suis revenu pour donner une autre réponse:

Dans Scala, vous ne pouvez pas surcharger les constructeurs, mais vous pouvez le faire avec les fonctions.

En outre, beaucoup choisissent de faire de la fonction d’ apply d’un object compagnon une fabrique pour la classe correspondante.

En rendant cette classe abstraite et en surchargeant la fonction apply pour implémenter-instancier cette classe, vous avez votre «constructeur» surchargé:

 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[Ssortingng]): Unit = { val expectTrueness = Expectation(true) … } } 

Notez que je définis explicitement chaque apply pour renvoyer une Expectation[T] , sinon elle renverrait une Expectation[T]{val expected: List[T]} .

Je pensais que Scala Constructors (2008-11-11) pourrait append plus d’informations.

Essaye ça

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