คีย์เวิร์ด by
มอบหมายการนำไปใช้ของอินเทอร์เฟซ
คีย์เวิร์ด 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ