Call the same interface method on different classes.

polymorphism Polymorphism lets code use a shared type while the object decides the method result.

Polymorphism

loud
Polymorphism.kt
Replay: real traced execution (multi-file project)
interface Speaker {
    fun speak(): String
}

class SoftSpeaker : Speaker {
    override fun speak(): String {
        return "soft"
    }
}

class LoudSpeaker : Speaker {
    override fun speak(): String {
        return "loud"
    }
}

fun main() {
    val loud = true
    val speaker: Speaker = if (loud) LoudSpeaker() else SoftSpeaker()
    val sound = speaker.speak()

    println("loud=$loud")
    println("sound=$sound")
}
interface Speaker {
    fun speak(): String
}

class SoftSpeaker : Speaker {
    override fun speak(): String {
        return "soft"
    }
}

class LoudSpeaker : Speaker {
    override fun speak(): String {
        return "loud"
    }
}

fun main() {
    val loud = false
    val speaker: Speaker = if (loud) LoudSpeaker() else SoftSpeaker()
    val sound = speaker.speak()

    println("loud=$loud")
    println("sound=$sound")
}
  1. loud ← true

    17fun main() {18    val loud→ true = true //@loud=false, true19    val speaker: Speaker = if (loudtrue) LoudSpeaker() else SoftSpeaker()20    val sound = speaker.speak()
  2. sound ← loud

    19    val speaker: Speaker = if (loud) LoudSpeaker() else SoftSpeaker()20    val sound→ loud = speaker.speak()2122    println("loud=$loudtrue")23    println("sound=$soundloud")24}
    outputloud=true
    sound=loud
  1. loud ← false

    17fun main() {18    val loud→ false = false19    val speaker: Speaker = if (loudfalse) LoudSpeaker() else SoftSpeaker()20    val sound = speaker.speak()
  2. sound ← soft

    19    val speaker: Speaker = if (loud) LoudSpeaker() else SoftSpeaker()20    val sound→ soft = speaker.speak()2122    println("loud=$loudfalse")23    println("sound=$soundsoft")24}
    outputloud=false
    sound=soft