Kotlin Academy · Pelajaran

Mendelegasikan kepada Anggota

Susun perilaku

Pelajaran 2 dari 413 langkah

Mendelegasikan kepada Anggota adalah pelajaran Kotlin Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Kotlin Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Kotlin Academy mencakup 4 pelajaran total.

Menyusun Perilaku

Objek nyata sering kali perlu menggabungkan beberapa kemampuan. Alih-alih mewarisi dari banyak sumber, Anda dapat mendelegasikan setiap kemampuan kepada objek anggota khusus.

Dua Peran, Satu Kelas

Misalkan sebuah kelas harus dapat membaca sekaligus menulis. Definisikan dua antarmuka dan delegasikan masing-masing kepada implementasinya sendiri.

interface Reader { fun read(): String }
interface Writer { fun write(s: String): String }

class FileReader : Reader { override fun read() = "contents" }
class FileWriter : Writer { override fun write(s: String) = "wrote " + s }

class FileIO(r: Reader, w: Writer) : Reader by r, Writer by w

fun main() {
    val io = FileIO(FileReader(), FileWriter())
    println(io.read())
    println(io.write("data"))
}

Beberapa Objek Delegasi

Sebuah kelas dapat mendelegasikan beberapa antarmuka sekaligus, masing-masing kepada anggota yang berbeda. Kelas tersebut menyusun perilaku mereka tanpa pewarisan.

interface Logger { fun log(m: String): String }
interface Validator { fun valid(m: String): Boolean }

class ConsoleLogger : Logger { override fun log(m: String) = "LOG: " + m }
class LengthValidator : Validator { override fun valid(m: String) = m.isNotEmpty() }

class Service(l: Logger, v: Validator) : Logger by l, Validator by v

fun main() {
    val s = Service(ConsoleLogger(), LengthValidator())
    println(s.valid("hi"))
    println(s.log("started"))
}

Objek Delegasi Disimpan sebagai Anggota

Jika Anda perlu merujuk objek delegasi di dalam penimpaan, simpan objek tersebut sebagai properti konstruktor. Instans yang sama mendukung penerusan dan kode khusus Anda.

interface Cache { fun get(k: String): String }

class MapCache : Cache {
    override fun get(k: String) = "value-of-" + k
}

class TracingCache(private val inner: Cache) : Cache by inner {
    override fun get(k: String): String {
        println("lookup " + k)
        return inner.get(k)
    }
}

fun main() {
    println(TracingCache(MapCache()).get("id"))
}

Menggabungkan Delegasi dan Keadaan Sendiri

Kelas yang menggunakan delegasi dapat menambahkan properti dan metode miliknya sendiri di samping anggota yang diteruskan, sehingga objek hasil komposisi menjadi lebih kaya.

interface Engine { fun start(): String }
class V8 : Engine { override fun start() = "vroom" }

class Car(e: Engine) : Engine by e {
    var doors = 4
    fun honk() = "beep"
}

fun main() {
    val c = Car(V8())
    println(c.start())
    println(c.honk())
    println(c.doors)
}

Menukar Implementasi

Karena objek delegasi hanyalah seorang anggota, Anda dapat membuat pembungkus yang sama dengan implementasi pendukung yang berbeda dan memilih perilakunya saat dijalankan.

interface Notifier { fun send(msg: String): String }
class EmailNotifier : Notifier { override fun send(msg: String) = "email: " + msg }
class SmsNotifier : Notifier { override fun send(msg: String) = "sms: " + msg }

class Alerts(n: Notifier) : Notifier by n

fun main() {
    println(Alerts(EmailNotifier()).send("hi"))
    println(Alerts(SmsNotifier()).send("hi"))
}

Mendelegasikan kepada Properti

Ekspresi setelah by dapat berupa ekspresi apa pun yang dievaluasi satu kali, termasuk pemanggilan konstruktor. Ekspresi tersebut tidak harus berupa parameter.

interface Greeter { fun greet() = "hi" }
class DefaultGreeter : Greeter

class Page : Greeter by DefaultGreeter()

fun main() {
    println(Page().greet())
}

Menghindari Masalah Berlian

Pewarisan banyak perilaku tidak mungkin dilakukan dengan kelas, tetapi mendelegasikan beberapa antarmuka kepada anggota yang terpisah dapat menghindari masalah berlian klasik dengan rapi.

interface A { fun a() = "A" }
interface B { fun b() = "B" }
class AImpl : A
class BImpl : B

class Combined : A by AImpl(), B by BImpl()

fun main() {
    val c = Combined()
    println(c.a() + c.b())
}

Merancang untuk Komposisi

Untuk menyusun komposisi dengan baik:

  • Definisikan antarmuka yang kecil dan fokus
  • Sediakan implementasi yang dapat digunakan kembali
  • Delegasikan setiap peran dalam kelas yang menyusun komposisi

Hal ini membuat kelas tetap fleksibel dan mudah diuji.

Rangkuman Delegasi Anggota

Mendelegasikan kepada objek anggota memungkinkan sebuah kelas menyusun perilaku dari berbagai bagian. Anda dapat menggabungkan banyak antarmuka, menimpa anggota tertentu, menukar implementasi, dan menambahkan keadaan sendiri — semuanya tanpa pewarisan.

Berikutnya: Perbandingan Langsung

Anda telah melihat betapa fleksibelnya delegasi. Pelajaran berikutnya membandingkan delegasi dan pewarisan secara langsung, sehingga Anda mengetahui kapan harus memilih masing-masing.

Pemeriksaan Singkat

Uji pemahaman Anda tentang delegasi kepada anggota.

Rangkuman

Anda telah mempelajari delegasi anggota:

  • Mendelegasikan beberapa antarmuka kepada objek yang terpisah
  • Menimpa anggota tertentu dan menambahkan keadaan sendiri
  • Menukar implementasi saat konstruksi
  • Menghindari masalah pewarisan banyak

Berikutnya: delegasi vs pewarisan.

Gratis untuk memulai

Belajar Kotlin dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
51
Pelajaran
203

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mendelegasikan kepada Anggota” gratis?

Ya — teks lengkap “Mendelegasikan kepada Anggota” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Kotlin Academy, upgrade ke CoddyKit PRO. Kursus Kotlin Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mendelegasikan kepada Anggota”?

Susun perilaku Kamu berlatih Kotlin Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Kotlin Academy?

Tidak diperlukan pengalaman sebelumnya. Kotlin Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Mendelegasikan kepada Anggota” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Kata Kunci by
  2. Mendelegasikan kepada Anggota
  3. Delegasi versus Pewarisan
  4. Pola Praktis
← Kembali ke Kotlin Academy