Sovraccarico costruttore Scala?


135

Come fornite costruttori sovraccarichi in Scala?

Risposte:


186

Vale la pena menzionare esplicitamente che i Costruttori ausiliari in Scala devono chiamare la risposta del costruttore principale (come in landon9720), o un altro costruttore ausiliario della stessa classe, come la loro prima azione. Non possono semplicemente chiamare il costruttore della superclasse in modo esplicito o implicito come in Java. Ciò garantisce che il costruttore principale sia l'unico punto di accesso alla classe.

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);   
}

@Jon McAuliffe: cattivo esempio? Senza il secondo e il terzo costruttore, l'utente può comunque chiamare new Foo(x=2,z=4)e new Foo(z=5)se cambi la tua prima linea inclass Foo(x: Int = 0, y: Int = 0, z: String) {
user2987828

Gli argomenti Named / Default non sono arrivati ​​fino a Scala 2.8.
Jon McAuliffe,

2
Vale la pena menzionare come utilizzare un costruttore di sovraccarico. Non è banale che la newparola chiave sia necessaria anche per le classi di casi.
Readren,

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

16

A partire da Scala 2.8.0 è inoltre possibile avere valori predefiniti per i parametri dei metodi e dei contrettori. Come questo

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)

I parametri con valori predefiniti devono venire dopo quelli senza valori predefiniti nell'elenco dei parametri.


3
Tuttavia, ciò non funziona per impostazioni predefinite non banali. quindi class Foo(val x:Int, y:Int=2*x)non funziona.
subsub

@ Jörgen Lundberg: hai scritto I parametri con valori predefiniti devono venire dopo quelli senza valori predefiniti nell'elenco dei parametri. È sbagliato, new Foo(x=2,z=4)stamperà Foo(2,0,4).
user2987828

@utente2987828 intendevo dire che non puoi scrivere nuovo Foo (12, x = 2) devi scrivere nuovo Foo (x = 2, 12). Puoi scrivere nuovo Foo (12, y = 2), quindi otterrai Foo (12, 2, 0)
Jörgen Lundberg,

10

Mentre guardavo il mio codice, improvvisamente mi sono reso conto di aver sovraccaricato un costruttore. Poi ho ricordato quella domanda e sono tornato per dare un'altra risposta:

In Scala, non puoi sovraccaricare i costruttori, ma puoi farlo con le funzioni.

Inoltre, molti scelgono di trasformare la applyfunzione di un oggetto compagno in una fabbrica per la rispettiva classe.

Rendendo astratta questa classe e sovraccaricando la applyfunzione per implementare l'istanza di questa classe, hai il tuo "costruttore" sovraccarico:

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)
    }
}

Si noti che io definisco esplicitamente ciascuno applyda restituire Expectation[T], altrimenti restituirebbe un'anatra digitata Expectation[T]{val expected: List[T]}.


0

Prova questo

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
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.