0Pricing
Scala for Backend Engineering & Functional Programming · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คลาส Case
  2. Trait แบบปิดผนึก
  3. ชนิดข้อมูลเชิงพีชคณิต
  4. การจับคู่ที่ครบถ้วน
← กลับไปที่ Scala for Backend Engineering & Functional Programming