Achtergrond:
Kotlin heeft de beste aspecten van Java en de functionele erfelijkheid van de JVM samengevoegd. Normale klassen worden gedeclareerd als standaardstructuren, abstracte klassen stellen je in staat om ondergedefinieerde sjablonen met standaardimplementatie te creëren, en interfaces ondersteunen meervoudige overdracht van gedrag zonder status.
Probleem:
De juiste keuze tussen een klasse, abstracte klasse en interface bepaalt de architectuur van de applicatie, de granulariteit van de code en de uitbreidbaarheid. Onjuiste overerving leidt tot testcomplexiteit en toekomstige wijzigingen.
Oplossing:
In Kotlin:
Voorbeeldcode:
interface Drawable { fun draw() } abstract class Shape(var color: String) : Drawable { abstract fun calcArea(): Double override fun draw() = println("Vorm getekend") } class Circle(color: String, val radius: Double) : Shape(color) { override fun calcArea() = Math.PI * radius * radius }
Belangrijke kenmerken:
Kunnen interfaces eigenschappen met een backing field bevatten?
Nee, ze kunnen alleen de handtekening van de eigenschap definiëren, maar geen gegevens opslaan — eigenschappen zonder backing field.
Kan je van meerdere klassen erven?
Nee, Kotlin ondersteunt alleen enkelvoudige overerving van klassen, maar meervoudige implementatie van interfaces.
Kan je een constructor in een interface declareren?
Nee, een interface ondersteunt geen constructors, omdat hij geen status opslaat — alleen een gedragcontract.
In de applicatie werden alle gemeenschappelijke functies in een abstracte klasse geplaatst, zelfs als er geen interne logica of status was, terwijl de behoefte gewoon een algemeen contract was.
Voordelen:
Nadelen:
Alleen de nodige contracten zijn in interfaces geplaatst, abstracte klassen zijn beperkt tot gemeenschappelijke eigenschappen en methoden die implementatie vereisen.
Voordelen:
Nadelen: