Kotlin Academy · Pelajaran

Delegasi berbanding pewarisan

Pilih gubahan

Pelajaran 3 daripada 413 langkah

Delegasi berbanding pewarisan ialah pelajaran Kotlin Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kotlin Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kotlin Academy merangkumi sejumlah 4 pelajaran.

Dua Cara Guna Semula

Pewarisan menyatakan bahawa kelas ialah sejenis kelas yang lain. Delegasi menyatakan bahawa kelas mempunyai rakan kerjasama yang menerima pemajuan daripadanya.

Nasihat klasik: utamakan penggabungan berbanding pewarisan.

Contoh Pewarisan

Dengan pewarisan, subkelas melanjutkan kelas asas dan mengatasi ahli. Kelas asas mestilah open dalam bahasa ini.

open class Animal {
    open fun sound() = "..."
}

class Dog : Animal() {
    override fun sound() = "woof"
}

fun main() {
    println(Dog().sound())
}

Contoh Delegasi

Penggunaan semula yang sama dengan delegasi: tingkah laku berada dalam ahli yang kepadanya kelas meneruskan panggilan.

interface Sound { fun sound(): String }
class Bark : Sound { override fun sound() = "woof" }

class Dog(s: Sound) : Sound by s

fun main() {
    println(Dog(Bark()).sound())
}

Kelas Asas yang Rapuh

Pewarisan mengikat subkelas dengan erat kepada dalaman kelas induknya. Perubahan pada kelas asas boleh merosakkan subkelas secara senyap — masalah kelas asas yang rapuh. Delegasi hanya bergantung pada antara muka.

Pengkapsulan

Subkelas boleh mengakses ahli terlindung dan menulis ganti cangkuk, lalu mengintai ke dalam kelas induk. Kelas yang menggunakan delegasi hanya melihat antara muka awam, sekali gus mengekalkan pengkapsulan.

interface Counter { fun increment(): Int }

class SimpleCounter : Counter {
    private var n = 0
    override fun increment(): Int { n++; return n }
}

class GuardedCounter(private val c: Counter) : Counter by c {
    override fun increment(): Int {
        println("incrementing")
        return c.increment()
    }
}

fun main() {
    val g = GuardedCounter(SimpleCounter())
    println(g.increment())
    println(g.increment())
}

Fleksibiliti Semasa Masa Jalan

Pewarisan menetapkan kelas induk pada masa kompilasi. Delegasi membolehkan anda memasukkan pelaksanaan yang berbeza pada masa jalan, sekali gus memudahkan ujian dengan objek palsu.

interface Clock { fun now(): Int }
class RealClock : Clock { override fun now() = 100 }
class FakeClock : Clock { override fun now() = 0 }

class Timer(c: Clock) : Clock by c

fun main() {
    println(Timer(RealClock()).now())
    println(Timer(FakeClock()).now()) // easy to test
}

Pelbagai Tingkah Laku

Sebuah kelas hanya boleh melanjutkan satu kelas induk, tetapi boleh menggunakan delegasi kepada banyak antara muka. Delegasi sesuai untuk menggabungkan beberapa keupayaan.

interface Walk { fun walk() = "walking" }
interface Swim { fun swim() = "swimming" }
class Walker : Walk
class Swimmer : Swim

class Amphibian : Walk by Walker(), Swim by Swimmer()

fun main() {
    val a = Amphibian()
    println(a.walk() + ", " + a.swim())
}

Apabila Pewarisan Sesuai

Pewarisan masih sesuai untuk hubungan ialah yang benar-benar wujud, dengan hierarki stabil yang direka untuk pengembangan: keluarga jenis tertutup, kelas asas rangka kerja dan polimorfisme atas jenis abstrak yang dikongsi.

sealed class Shape
class Circle(val r: Double) : Shape()
class Square(val s: Double) : Shape()

fun area(shape: Shape) = when (shape) {
    is Circle -> 3.14 * shape.r * shape.r
    is Square -> shape.s * shape.s
}

fun main() {
    println(area(Circle(2.0)))
}

Apabila Delegasi Sesuai

Pilih delegasi apabila anda mahu:

  • Menggunakan semula tingkah laku merentas jenis yang tidak berkaitan
  • Menggabungkan beberapa keupayaan
  • Mengekalkan gandingan yang rendah dan memudahkan ujian
  • Membalut dan menghiasi pelaksanaan sedia ada

Perbandingan Sebelah Menyebelah

Pewarisan: satu kelas induk, gandingan erat, ditetapkan pada masa kompilasi, ialah. Delegasi: banyak rakan usaha sama, gandingan longgar, boleh ditukar pada masa jalan, mempunyai. Kotlin menjadikan delegasi murah dengan by, lalu memihak kepada komposisi.

Pilihan Lalai yang Praktikal

Peraturan yang baik: mulakan dengan delegasi. Beralih kepada pewarisan hanya apabila hierarki ialah yang benar-benar wujud dan stabil terbentuk. Ini menjadikan reka bentuk lebih fleksibel dan tahan terhadap perubahan.

Semakan Pantas

Uji pemahaman anda tentang delegasi berbanding pewarisan.

Imbas Kembali

Anda telah membandingkan kedua-dua pendekatan:

  • Pewarisan: ialah, satu kelas induk, gandingan erat
  • Delegasi: mempunyai, banyak rakan usaha sama, gandingan longgar
  • Utamakan komposisi; gunakan pewarisan untuk hierarki ialah yang stabil

Seterusnya: corak penghias praktikal dengan delegasi.

Percuma untuk bermula

Pelajari Kotlin dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Delegasi berbanding pewarisan” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Kotlin Academy, termasuk “Delegasi berbanding pewarisan”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Kotlin Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Delegasi berbanding pewarisan”?

Pilih gubahan Anda berlatih Kotlin Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Kotlin Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Kotlin Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Delegasi berbanding pewarisan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kotlin Academy ini?

Ya. Setiap pelajaran Kotlin Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Kata kunci by
  2. Mewakilkan kepada ahli
  3. Delegasi berbanding pewarisan
  4. Corak praktikal
← Kembali ke Kotlin Academy