Trait แบบปิดผนึก
ลำดับชั้นแบบปิด
Trait แบบปิดผนึก เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
Trait คืออะไร
Trait คล้ายกับส่วนติดต่อ โดยประกาศชนิดร่วมที่คลาสอื่นสามารถสืบทอดได้
Trait ช่วยให้คุณจัดกลุ่มชนิดที่เกี่ยวข้องกันไว้ภายใต้กรอบเดียวกัน เพื่อให้ใช้งานแทนกันได้
Trait พื้นฐาน
ประกาศ trait ด้วย trait จากนั้นให้คลาสหรือออบเจ็กต์ extends trait นั้น
trait Shape
case class Circle(r: Double) extends Shape
case class Square(side: Double) extends Shape
object Main {
def main(args: Array[String]): Unit = {
val s: Shape = Circle(2.0)
println(s)
}
}sealed หมายถึงอะไร
Trait ที่เป็น sealed สามารถถูกสืบทอดได้เฉพาะโดยชนิดที่ประกาศอยู่ใน ไฟล์เดียวกัน เท่านั้น
วิธีนี้จะปิดลำดับชั้นไว้ ทำให้คอมไพเลอร์ทราบรายการประเภทย่อยที่เป็นไปได้ทั้งหมด
sealed trait Color
case object Red extends Color
case object Green extends Color
case object Blue extends Color
object Main {
def main(args: Array[String]): Unit = {
val c: Color = Green
println(c)
}
}ใช้ออบเจ็กต์แบบ case เป็นรูปแบบย่อย
เมื่อรูปแบบย่อยไม่มีข้อมูล ให้ใช้ case object แทน case class โดยจะมีอินสแตนซ์ได้เพียงหนึ่งเดียวเท่านั้น
เหมาะอย่างยิ่งสำหรับค่าที่มีลักษณะคล้าย enum
sealed trait Direction
case object North extends Direction
case object South extends Direction
object Main {
def main(args: Array[String]): Unit = {
val d: Direction = North
println(d)
}
}ผสมออบเจ็กต์กับคลาส
Trait แบบ sealed สามารถมีรูปแบบย่อยที่เป็นทั้ง case object (ไม่มีข้อมูล) และ case class (มีข้อมูล) ได้
sealed trait Event
case object Started extends Event
case class Failed(reason: String) extends Event
object Main {
def main(args: Array[String]): Unit = {
val e: Event = Failed("timeout")
println(e)
}
}จับคู่รูปแบบบน Trait แบบ sealed
คุณจับคู่รูปแบบบน trait และจัดการรูปแบบย่อยแต่ละแบบ เนื่องจากลำดับชั้นเป็น sealed คอมไพเลอร์จึงตรวจสอบได้ว่าคุณครอบคลุมครบทุกแบบ
sealed trait Color
case object Red extends Color
case object Green extends Color
case object Blue extends Color
object Main {
def hex(c: Color): String = c match {
case Red => "#FF0000"
case Green => "#00FF00"
case Blue => "#0000FF"
}
def main(args: Array[String]): Unit = {
println(hex(Green))
}
}คำเตือนจากคอมไพเลอร์
หากคุณลืมรูปแบบย่อยใดรูปแบบหนึ่งในการจับคู่รูปแบบบน trait แบบ sealed คอมไพเลอร์จะแจ้งเตือนว่ามีกรณีที่ขาดหายไป
วิธีนี้ช่วยตรวจจับข้อผิดพลาดเมื่อภายหลังคุณเพิ่มรูปแบบย่อยใหม่ เราจะศึกษาเรื่องนี้อย่างละเอียดในบทเรียนการจับคู่รูปแบบให้ครบทุกกรณี
Trait สามารถประกาศสมาชิกได้
Trait สามารถประกาศเมธอดหรือฟิลด์ที่ประเภทย่อยทั้งหมดใช้ร่วมกัน หรือต้องนำไปใช้งานได้
sealed trait Animal {
def sound: String
}
case object Dog extends Animal { def sound = "Woof" }
case object Cat extends Animal { def sound = "Meow" }
object Main {
def main(args: Array[String]): Unit = {
println(Dog.sound)
println(Cat.sound)
}
}ทำไมต้องใช้ sealed
การทำให้ trait เป็น sealed ช่วยให้คุณได้รับสิ่งต่อไปนี้:
- ชุดประเภทย่อยที่ทราบแน่ชัดและปิดไว้
- การตรวจสอบความครบถ้วนใน
match - การปรับโครงสร้างโค้ดให้ปลอดภัยยิ่งขึ้นเมื่อเพิ่มรูปแบบย่อย
Trait แบบ sealed ร่วมกับคลาสแบบ case คือวิธีที่ Scala ใช้สร้างชนิดข้อมูลเชิงพีชคณิต
ใช้งานลำดับชั้น
ฟังก์ชันสามารถรับชนิดของ trait และทำงานกับรูปแบบย่อยใดก็ได้ โดยเลือกการทำงานผ่านการจับคู่รูปแบบ
sealed trait Payment
case class Cash(amount: Int) extends Payment
case class Card(number: String) extends Payment
object Main {
def summary(p: Payment): String = p match {
case Cash(a) => s"cash $a"
case Card(n) => s"card ending ${n.takeRight(4)}"
}
def main(args: Array[String]): Unit = {
println(summary(Cash(50)))
println(summary(Card("123456789012")))
}
}นำทุกอย่างมารวมกัน
Trait แบบ sealed ที่มีรูปแบบย่อยหลายแบบ และใช้ร่วมกันผ่านฟังก์ชันที่จับคู่รูปแบบแต่ละกรณี
sealed trait Result
case object Pending extends Result
case class Success(value: Int) extends Result
case class Error(msg: String) extends Result
object Main {
def show(r: Result): String = r match {
case Pending => "waiting"
case Success(v) => s"ok: $v"
case Error(m) => s"fail: $m"
}
def main(args: Array[String]): Unit = {
List(Pending, Success(7), Error("boom")).foreach(r => println(show(r)))
}
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับ trait แบบ sealed
สรุปทบทวน
คุณได้เรียนรู้เกี่ยวกับ trait แบบ sealed:
traitกำหนดประเภทแม่ร่วมsealedจำกัดประเภทย่อยให้อยู่ในไฟล์เดียวกัน- ใช้
case objectสำหรับรูปแบบย่อยที่ไม่มีข้อมูล และใช้case classสำหรับรูปแบบย่อยที่มีข้อมูล - การใช้ sealed ทำให้ตรวจสอบความครบถ้วนในการจับคู่รูปแบบของ
matchได้
คำถามที่พบบ่อย
บทเรียน “Trait แบบปิดผนึก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Trait แบบปิดผนึก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Trait แบบปิดผนึก”
ลำดับชั้นแบบปิด คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “Trait แบบปิดผนึก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม
ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คลาส Case
- Trait แบบปิดผนึก
- ชนิดข้อมูลเชิงพีชคณิต
- การจับคู่ที่ครบถ้วน