คุณจัดหาช่างก่อสร้างที่มีภาระมากเกินไปใน Scala ได้อย่างไร?
คุณจัดหาช่างก่อสร้างที่มีภาระมากเกินไปใน Scala ได้อย่างไร?
คำตอบ:
เป็นเรื่องที่ควรค่าแก่การกล่าวถึงอย่างชัดเจนว่า Auxiliary Constructor ใน Scala ต้องเรียกคำตอบของตัวสร้างหลัก (เช่นเดียวกับใน landon9720's) หรือตัวสร้างเสริมอื่นจากคลาสเดียวกันเป็นการกระทำครั้งแรก พวกเขาไม่สามารถเรียกคอนสตรัคเตอร์ของซูเปอร์คลาสอย่างชัดเจนหรือโดยปริยายเท่าที่ทำได้ใน Java สิ่งนี้ทำให้มั่นใจได้ว่าตัวสร้างหลักเป็นจุดเดียวของการเข้าสู่คลาส
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
คีย์เวิร์ดจำเป็นสำหรับคลาสเคส
class Foo(x: Int, y: Int) {
def this(x: Int) = this(x, 0) // default y parameter to 0
}
ตั้งแต่ Scala 2.8.0 คุณยังสามารถมีค่าเริ่มต้นสำหรับพารามิเตอร์ contructor และ method แบบนี้
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)
พารามิเตอร์ที่มีค่าดีฟอลต์ต้องมาตามหลังพารามิเตอร์ที่ไม่มีค่าดีฟอลต์ในรายการพารามิเตอร์
class Foo(val x:Int, y:Int=2*x)
ไม่ทำงาน
new Foo(x=2,z=4)
Foo(2,0,4)
ในขณะที่ดูรหัสของฉันฉันก็รู้ทันทีว่าฉันทำคอนสตรัคเตอร์เกินพิกัด จากนั้นฉันก็จำคำถามนั้นได้และกลับมาเพื่อให้คำตอบอีกครั้ง:
ใน Scala คุณไม่สามารถโอเวอร์โหลดคอนสตรัคเตอร์ได้ แต่สามารถทำได้ด้วยฟังก์ชัน
นอกจากนี้หลายคนเลือกที่จะทำให้apply
ฟังก์ชันของอ็อบเจ็กต์ร่วมเป็นโรงงานสำหรับคลาสที่เกี่ยวข้อง
การทำให้คลาสนี้เป็นนามธรรมและการโอเวอร์โหลดapply
ฟังก์ชันในการใช้งาน - อินสแตนซ์คลาสนี้คุณมี "ตัวสร้าง" ที่โอเวอร์โหลด:
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)
…
}
}
หมายเหตุที่ผมกำหนดอย่างชัดเจนในแต่ละapply
ที่จะกลับอื่นก็จะกลับมาเป็นเป็ดพิมพ์Expectation[T]
Expectation[T]{val expected: List[T]}
ลองทำตามนี้
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)
และnew Foo(z=5)
ถ้าคุณเปลี่ยนบรรทัดแรกเป็นclass Foo(x: Int = 0, y: Int = 0, z: String) {