Delegering jämfört med arv
Välj komposition
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.
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
- Nyckelordet by
- Delegera till medlemmar
- Delegering jämfört med arv
- Praktiska mönster