Kotlin Academy · บทเรียน

คีย์เวิร์ด by

มอบหมายการนำไปใช้ของอินเทอร์เฟซ

บทเรียน 1 จาก 413 ขั้นตอน

คีย์เวิร์ด by เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

การมอบหมายงานคืออะไร

การมอบหมายงานของคลาสช่วยให้ออบเจ็กต์หนึ่งส่งต่อการใช้งานอินเทอร์เฟซให้กับออบเจ็กต์อีกตัวหนึ่ง Kotlin มีความสามารถนี้ในภาษาโดยใช้คำหลัก by

นี่คือการประกอบที่ทำได้อย่างง่ายดาย

อินเทอร์เฟซสำหรับมอบหมายงาน

เริ่มจากอินเทอร์เฟซและการนำไปใช้จริงแบบหนึ่ง ต่อไปเราจะมอบหมายงานให้การนำไปใช้นี้

interface Speaker {
    fun speak(): String
}

class LoudSpeaker : Speaker {
    override fun speak() = "HELLO!"
}

fun main() {
    println(LoudSpeaker().speak())
}

คำหลัก by

เขียน class X(d: Iface) : Iface by d คอมไพเลอร์จะสร้างเมธอดส่งต่อที่เรียก d ให้กับสมาชิกทุกตัวของอินเทอร์เฟซ

interface Speaker {
    fun speak(): String
}

class LoudSpeaker : Speaker {
    override fun speak() = "HELLO!"
}

class Announcer(s: Speaker) : Speaker by s

fun main() {
    val a = Announcer(LoudSpeaker())
    println(a.speak())
}

ไม่ต้องเขียนโค้ดซ้ำซ้อน

หากไม่มี by คุณจะต้องเขียนเมธอดส่งต่อสำหรับทุกฟังก์ชันของอินเทอร์เฟซด้วยตนเอง การมอบหมายงานจะสร้างเมธอดทั้งหมดให้โดยอัตโนมัติ

interface Repository {
    fun save(item: String): String
    fun count(): Int
}

class MemoryRepo : Repository {
    private val items = mutableListOf<String>()
    override fun save(item: String): String { items.add(item); return item }
    override fun count() = items.size
}

class LoggingRepo(r: Repository) : Repository by r

fun main() {
    val repo = LoggingRepo(MemoryRepo())
    repo.save("a")
    println(repo.count())
}

การแทนที่สมาชิกบางรายการ

คุณสามารถแทนที่เฉพาะสมาชิกที่ต้องการปรับแต่ง ส่วนที่เหลือยังคงถูกส่งต่อไปยังตัวรับมอบหมาย

interface Repository {
    fun save(item: String): String
    fun count(): Int
}

class MemoryRepo : Repository {
    private val items = mutableListOf<String>()
    override fun save(item: String): String { items.add(item); return item }
    override fun count() = items.size
}

class LoggingRepo(private val r: Repository) : Repository by r {
    override fun save(item: String): String {
        println("saving " + item)
        return r.save(item)
    }
}

fun main() {
    val repo = LoggingRepo(MemoryRepo())
    repo.save("book")
    println(repo.count())
}

ตัวรับมอบหมายเป็นพารามิเตอร์

โดยทั่วไปตัวรับมอบหมายจะถูกส่งผ่านตัวสร้างหลัก คุณสามารถเก็บการอ้างอิงไว้ด้วย private val หากต้องการแทนที่สมาชิกบางรายการด้วย

interface Clock { fun now(): Int }

class FixedClock : Clock { override fun now() = 12 }

class App(private val clock: Clock) : Clock by clock

fun main() {
    println(App(FixedClock()).now())
}

การมอบหมายงานให้อินเทอร์เฟซมาตรฐาน

คุณสามารถมอบหมายงานให้อินเทอร์เฟซคอลเลกชันในตัว และได้ตัวห่อหุ้มที่ทำงานเหมือนคอลเลกชันพื้นฐานทันที

class TaggedList(private val inner: List<String>) : List<String> by inner {
    val tag = "v1"
}

fun main() {
    val tl = TaggedList(listOf("x", "y"))
    println(tl.size)
    println(tl[0])
    println(tl.tag)
}

การคอมไพล์ทำงานอย่างไร

เบื้องหลัง คอมไพเลอร์จะจัดเก็บตัวรับมอบหมายและสร้างการนำไปใช้แบบส่งต่อ เมธอดที่สร้างขึ้นจะเรียกเมธอดที่ตรงกันของตัวรับมอบหมาย การทำงานเหมือนการเขียนการส่งต่อด้วยตนเอง เพียงไม่ต้องพิมพ์โค้ดเอง

ค่าที่เก็บไว้ขณะสร้าง

รายละเอียดสำคัญที่ควรสังเกตคือ การอ้างอิงตัวรับมอบหมายจะถูกเก็บไว้เมื่อสร้างออบเจ็กต์ สมาชิกที่แทนที่จะเรียกตัวรับมอบหมายอย่างชัดเจน แต่ตัวส่งต่อที่สร้างขึ้นจะใช้อินสแตนซ์ที่ส่งเข้ามาแต่แรก

interface Source { fun value(): Int }

class Const(val n: Int) : Source { override fun value() = n }

class Wrapper(s: Source) : Source by s

fun main() {
    val w = Wrapper(Const(42))
    println(w.value())
}

เหตุผลที่ใช้คำหลักนี้

คำหลัก by ช่วยให้คุณสามารถ:

  • นำการนำไปใช้ที่มีอยู่กลับมาใช้ใหม่
  • เพิ่มพฤติกรรมโดยไม่ต้องสืบทอดคลาส
  • หลีกเลี่ยงลำดับชั้นการสืบทอดที่เปราะบาง

นี่คือการรองรับหลักการเลือกการประกอบแทนการสืบทอดของภาษา Kotlin อย่างเต็มรูปแบบ

รากฐาน

คำหลัก by นี้เป็นรากฐานของทุกเรื่องในบทเรียนนี้ ถัดไปเราจะดูการมอบหมายงานให้กับออบเจ็กต์สมาชิกอย่างละเอียดขึ้น เพื่อประกอบพฤติกรรม

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับคำหลักนี้

ทบทวน

คุณได้เรียนรู้การมอบหมายงานของคลาสด้วย by:

  • มอบหมายอินเทอร์เฟซให้กับออบเจ็กต์อื่น
  • สร้างเมธอดส่งต่อโดยอัตโนมัติ
  • แทนที่สมาชิกบางรายการและส่งต่อส่วนที่เหลือ
  • ใช้งานกับอินเทอร์เฟซในตัวได้เช่นกัน

ถัดไป: การมอบหมายงานให้สมาชิกเพื่อประกอบพฤติกรรม

เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

คำถามที่พบบ่อย

บทเรียน “คีย์เวิร์ด by” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “คีย์เวิร์ด by” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “คีย์เวิร์ด by”

มอบหมายการนำไปใช้ของอินเทอร์เฟซ คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “คีย์เวิร์ด by” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. คีย์เวิร์ด by
  2. การมอบหมายให้สมาชิก
  3. การมอบหมายเทียบกับการสืบทอด
  4. รูปแบบเชิงปฏิบัติ
← กลับไปที่ Kotlin Academy