Kotlin Academy · Lektion

Delegering jämfört med arv

Välj komposition

Lektion 3 av 413 steg

Delegering jämfört med arv är en gratis lektion i Kotlin Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Kotlin Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Kotlin Academy innehåller totalt 4 lektioner.

Två sätt att återanvända

Arv och delegering återanvänder båda beteende. Arv innebär att en klass är en sorts annan klass. Delegering innebär att en klass har en samarbetspartner som den vidarebefordrar till.

Det klassiska rådet är att föredra komposition framför arv.

Exempel på arv

Med arv utökar en underklass en basklass och åsidosätter medlemmar. Basklassen måste vara open i Kotlin.

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

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

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

Exempel på delegering

Samma återanvändning med delegering: beteendet finns i en medlem som klassen vidarebefordrar anrop till.

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())
}

Problemet med den sköra basklassen

Arv kopplar en underklass hårt till superklassens interna implementation. En ändring i basklassen kan omärkligt bryta underklasser — problemet med den sköra basklassen. Delegering är endast beroende av gränssnittet.

Inkapsling

En underklass kan komma åt protected-medlemmar och åsidosätta utökningspunkter, vilket ger insyn i superklassen. En delegerande klass ser bara det offentliga gränssnittet och bevarar därmed inkapslingen.

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())
}

Flexibilitet under körning

Arv låser fast superklassen vid kompilering. Med delegering kan ni injicera olika implementationer under körning, vilket underlättar testning med testdubbletter.

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
}

Flera beteenden

En klass kan bara ärva från en enda superklass, men den kan delegera till många gränssnitt. Delegering lämpar sig därför för att kombinera flera funktioner.

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())
}

När arv passar

Arv passar fortfarande vid en äkta is-a-relation med en stabil hierarki som är utformad för utökning: slutna typfamiljer, basklasser i ramverk och polymorfism över en gemensam abstrakt typ.

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)))
}

När delegering passar

Välj delegering när ni vill:

  • Återanvända beteende mellan orelaterade typer
  • Kombinera flera funktioner
  • Hålla kopplingen lös och testningen enkel
  • Omsluta och dekorera befintliga implementationer

Sida vid sida

Arv: en superklass, tät koppling, fast vid kompilering, is-a. Delegering: många samarbetande objekt, lös koppling, utbytbara under körning, has-a. Kotlin gör delegering billig med by, vilket förskjuter balansen mot komposition.

En praktisk standard

En bra tumregel är att börja med delegering. Byt till arv först när en äkta och stabil is-a-hierarki har vuxit fram. Då förblir designen flexibel och motståndskraftig mot förändringar.

Snabbtest

Testa er förståelse av delegering jämfört med arv.

Sammanfattning

Ni jämförde de två metoderna:

  • Arv: is-a, en enda superklass, tät koppling
  • Delegering: has-a, många samarbetande objekt, lös koppling
  • Föredra komposition och använd arv för stabila is-a-hierarkier

Nästa steg: praktiska dekoratörsmönster med delegering.

Gratis att börja

Lär dig Kotlin med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”Delegering jämfört med arv” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Kotlin Academy, inklusive ”Delegering jämfört med arv”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Kotlin Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Delegering jämfört med arv”?

Välj komposition Ni övar på Kotlin Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Kotlin Academy?

Du behöver inga förkunskaper. Utbildningen i Kotlin Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Delegering jämfört med arv”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Kotlin Academy-lektionen?

Ja. Varje Kotlin Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Nyckelordet by
  2. Delegera till medlemmar
  3. Delegering jämfört med arv
  4. Praktiska mönster
← Tillbaka till Kotlin Academy