Scala kurucu aşırı yük?


135

Scala'da aşırı yüklenmiş inşaatçıları nasıl temin ediyorsunuz?

Yanıtlar:


186

Scala'daki Yardımcı Yapıcıların ya ilk kurucu (landon9720'ninki gibi) cevabı ya da ilk eylemleri olarak aynı sınıftan başka bir yardımcı kurucu çağırması gerektiğini açıkça belirtmek gerekir. Üst sınıfın yapıcısını Java'daki gibi açıkça veya örtük olarak çağıramazlar. Bu, birincil kurucunun sınıfa tek giriş noktası olmasını sağlar.

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: Kötü örnek mi? İkinci ve üçüncü kurucular olmadan, kullanıcı hala arayabilir new Foo(x=2,z=4)ve new Foo(z=5)ilk hattınızı değiştirirsenizclass Foo(x: Int = 0, y: Int = 0, z: String) {
user2987828

Adlandırılmış / Varsayılan argümanlar Scala 2.8'e kadar ulaşmadı.
Jon McAuliffe

2
Aşırı yük yapıcısının nasıl kullanılacağından bahsetmeye değer. newAnahtar kelimenin vaka sınıfları için bile gerekli olması önemsiz değildir .
Readren

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

16

Scala 2.8.0'dan itibaren yapıcı ve yöntem parametreleri için varsayılan değerlere de sahip olabilirsiniz. Bunun gibi

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)

Varsayılan değerleri olan parametreler, parametre listesinde varsayılan değeri olmayanlardan sonra gelmelidir.


3
Bu önemsiz olmayan varsayılanlar için çalışmaz. böylece class Foo(val x:Int, y:Int=2*x)çalışmaz.
subsub

@ Jörgen Lundberg: Varsayılan değerler içeren parametrelerin, parametre listesinde varsayılan değeri olmayan parametrelerden sonra gelmesi gerektiğini yazdınız. Yanlış, new Foo(x=2,z=4)yazdıracak Foo(2,0,4).
user2987828

@ user2987828 Ne demek istediğim yeni Foo (12, x = 2) yazamazsın, yeni Foo (x = 2, 12) yazmalısın. Yeni Foo (12, y = 2) yazabilirsiniz, o zaman Foo (12, 2, 0) elde edersiniz
Jörgen Lundberg

10

Koduma bakarken birdenbire bir yapıcıya aşırı yük bindiğimi fark ettim. Daha sonra bu soruyu hatırladım ve başka bir cevap vermek için geri geldim:

Scala'da yapıcıları aşırı yükleyemezsiniz, ancak bunu işlevlerle yapabilirsiniz.

Ayrıca, birçoğu applytamamlayıcı nesnenin işlevini ilgili sınıf için bir fabrika yapmayı tercih eder .

Bu sınıfı soyut yapmak ve bu sınıfı applyuygulamak için işlevi aşırı yüklemek, aşırı yüklenmiş “kurucunuz” var:

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

Ben açıkça her applydönmek için tanımlamak unutmayın Expectation[T], aksi takdirde bir ördek türü dönecekti Expectation[T]{val expected: List[T]}.


0

Bunu dene

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
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.