Softwarecursussen en Technologie

Softwareforum => Kotlin => Topic gestart door: Murat op jan 13, 2026, 08:38 AM

Titel: Objectgericht Programmeren (OOP) in Kotlin: Classes, Data Classes en Inheritance
Bericht door: Murat op jan 13, 2026, 08:38 AM
Objectgericht Programmeren (OOP) in Kotlin is een krachtig paradigma dat de procedurele en functionele aspecten van de taal aanvult. Kotlin maakt OOP uit Java korter, veiliger en moderner – vooral met functies zoals data classes, sealed classes, object expressions en companion objects die boilerplate-code minimaliseren. In 2026 is OOP onmisbaar in Android (met Jetpack Compose en ViewModels), backend (Ktor/Spring Boot entities) en Kotlin Multiplatform-projecten (gedeelde code voor modelklassen). De OOP-aanpak van Kotlin, gecombineerd met null-veiligheid en immutability, produceert veel robuustere code.

Op Google zijn zoekopdrachten zoals "Kotlin class", "Kotlin data class", "Kotlin inheritance", "Kotlin sealed class" hoog in volume in Turkije en wereldwijd. Een goed begrip van OOP zorgt voor betere code-organisatie, hergebruik en onderhoudsgemak in grote projecten. In deze gids behandelen we alles stap voor stap, van basis class-definities tot geavanceerde inheritance en speciale klassen.

Waarom OOP in Kotlin Leren? (2026 Perspectief)

In Kotlin is alles een object – zelfs primitieve typen (Int, Boolean) gedragen zich als klassen.

1. Basis Class Definitie
Classes worden gedefinieerd met het sleutelwoord class. De primary constructor staat direct in de class-naam.
class Auto(val merk: String, val model: String, var jaar: Int) { // primary
    // Init block (werkt in constructor)
    init {
        require(jaar > 1900) { "Ongeldig jaar!" }
    }
    // Secondary constructor
    constructor(merk: String, model: String) : this(merk, model, 2020)
    // Property (eigenschap)
    var km: Int = 0
        private set // Alleen veranderbaar binnen class
    // Method
    fun rijden(kmToevoegen: Int) {
        km += kmToevoegen
    }
    fun infoGeven(): String {
        return "$jaar $merk $model, KM: $km"
    }
    // Override toString (optioneel)
    override fun toString() = infoGeven()
}
// Gebruik
val auto1 = Auto("Toyota", "Corolla", 2022)
auto1.rijden(150)
println(auto1.infoGeven()) // 2022 Toyota Corolla, KM: 150
val auto2 = Auto("BMW", "3 Serie") // secondary constructor

2. Data Classes – De Ster van Kotlin
Speciale class voor data-opslag. Genereert automatisch equals(), hashCode(), toString(), copy(), componentN().
data class Persoon(
    val naam: String,
    val leeftijd: Int,
    val stad: String = "Istanbul" // default waarde
)
// Gebruik
val persoon1 = Persoon("Ahmet", 30)
val persoon2 = Persoon("Ahmet", 30, "Ankara")
val persoon3 = persoon1.copy(leeftijd = 31) // kopiëren met wijziging
println(persoon1) // Persoon(naam=Ahmet, leeftijd=30, stad=Istanbul)
println(persoon1 == persoon2) // false (stad verschilt)
println(persoon1.component1()) // naam (voor destructuring)
// Destructuring
val (naam, leeftijd, stad) = persoon1
println("$naam $leeftijd jaar oud, $stad") // Ahmet 30 jaar oud, Istanbul

Wanneer data class? Alleen als het puur data bevat (DTO, entity, model). Als je methods toevoegt, kies dan een normale class.

3. Inheritance (Erfenis)
Standaard zijn alle classes final – niet erfbaar. Gebruik open voor erfenis.

Abstract Classes
abstract class Vorm {
    abstract fun oppervlakte(): Double
}

class Rechthoek(val breedte: Double, val hoogte: Double) : Vorm() {
    override fun oppervlakte() = breedte * hoogte
}

val vorm: Vorm = Rechthoek(5.0, 10.0)
println(vorm.oppervlakte()) // 50.0

4. Interfaces
Meerdere erfenissen ondersteund. Interfaces kunnen default implementaties bevatten.
interface KanVliegen {
    fun vlieg() = println("Vliegt!") // default
    fun maxSnelheid(): Int // abstract
}
interface KanZwemmen {
    fun zwem()
}
class VliegendeAuto(merk: String) : Voertuig(merk), KanVliegen, KanZwemmen {
    override fun maxSnelheid() = 300
    override fun zwem() = println("Zwemmen in zee!")
}
val vliegend = VliegendeAuto("Tesla")
vliegend.vlieg() // Vliegt!
vliegend.zwem()

5. Sealed Classes (Gesloten Classes)
Voor type-veiligheid – when-expressies zijn exhaustive (alle subklassen gecontroleerd).
sealed class Resultaat {
    data class Succes(val data: String) : Resultaat()
    data class Fout(val bericht: String) : Resultaat()
    object Laden : Resultaat() // singleton
}
fun verwerk(resultaat: Resultaat) = when (resultaat) {
    is Resultaat.Succes -> println("Data: ${resultaat.data}")
    is Resultaat.Fout -> println("Fout: ${resultaat.bericht}")
    Resultaat.Laden -> println("Laden...")
}
// Gebruik
verwerk(Resultaat.Succes("Voltooid"))

6. Speciale Structuren
• Object Declaration (Singleton):
object Database {
    fun verbind() = println("Verbonden")
}
Database.verbind() // direct toegang

• Companion Object (Singleton binnen class):
class Fabriek {
    companion object {
        fun nieuweAuto() = Auto("Ford", "Focus")
    }
}
val auto = Fabriek.nieuweAuto()

• Enum Classes:
enum class Richting { NOORD, ZUID, OOST, WEST }
Visibility Modifiers
• public (default), private, protected, internal (zichtbaar binnen dezelfde module).

Conclusie en Praktische Tips
Kotlin OOP is veel korter en krachtiger dan in Java – data classes en sealed classes redden levens. Voor praktijk:

Met deze gids heb je Kotlin OOP volledig onder de knie. In echte projecten (Android apps, API models) bieden deze structuren groot voordeel. Laat een opmerking achter voor een voorbeeldproject of specifiek deel! Succes met je Kotlin-ontwikkelingen in 2026.