Scala'da aşırı yüklenmiş inşaatçıları nasıl temin ediyorsunuz?
Scala'da aşırı yüklenmiş inşaatçıları nasıl temin ediyorsunuz?
Yanıtlar:
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);
}
new
Anahtar kelimenin vaka sınıfları için bile gerekli olması önemsiz değildir .
class Foo(x: Int, y: Int) {
def this(x: Int) = this(x, 0) // default y parameter to 0
}
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.
class Foo(val x:Int, y:Int=2*x)
çalışmaz.
new Foo(x=2,z=4)
yazdıracak Foo(2,0,4)
.
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 apply
tamamlayı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ı apply
uygulamak 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 apply
dönmek için tanımlamak unutmayın Expectation[T]
, aksi takdirde bir ördek türü dönecekti Expectation[T]{val expected: List[T]}
.
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
}
}
new Foo(x=2,z=4)
venew Foo(z=5)
ilk hattınızı değiştirirsenizclass Foo(x: Int = 0, y: Int = 0, z: String) {