kierans777
03/17/2022, 2:44 AMopen class Animal(val name: String)
class LandAnimal(name: String, val legs: Int) : Animal(name)
class SeaAnimal(name: String, val flippers: Int) : Animal(name)
fun printAppendages(animal: SeaAnimal) {
print(" has ${animal.flippers} flippers")
}
fun printAppendages(animal: LandAnimal) {
print(" has ${animal.legs} legs")
}
fun printAppendages(animal: Animal) {
print(" has no appendages")
}
fun <T : Animal> printAnimal(animal: T) {
print(animal.name)
printAppendages(animal)
print("\n")
}
fun main() {
val lassie = LandAnimal("Lassie", 4)
val nemo = SeaAnimal("Nemo", 2)
printAnimal(lassie)
printAnimal(nemo)
}
Lassie has no appendages
Nemo has no appendages
Or is polymorphic dispatch only for methods?Joffrey
03/17/2022, 7:29 AMTim Oltjenbruns
03/17/2022, 12:26 PMclass Appendage(val name: String)
open class Animal(val name: String, val appendages: List<Appendage>)
// or alternatively if not all animals have appendages
open class AppendagedAnimal(name: String, val appendages: List<Appendage>) : Animal(name)
// or if all appendages on one animal type have the same name
class Appendages(val name: String, val count: Int)
class Animal(val name: String, val appendages: Appendages? = null)
sealed class Animal(val name: String)
class LandAnimal(name: String, val legs: Int) : Animal(name)
class SeaAnimal(name: String, val flippers: Int) : Animal(name)
class OtherAnimal(name: String) : Animal(name)
fun Animal.printAppendages() {
when (this) {
is LandAnimal -> printAppendages()
is SeaAnimal -> printAppendages()
is OtherAnimal -> printAppendages()
}
}
fun SeaAnimal.printAppendages() {
print(" has $flippers flippers")
}
fun LandAnimal.printAppendages() {
print(" has $legs legs")
}
fun OtherAnimal.printAppendages() {
print(" has no appendages")
}
fun main() {
val lassie = LandAnimal("Lassie", 4)
val nemo = SeaAnimal("Nemo", 2)
lassie.printAppendages()
nemo.printAppendages()
}
open class Animal(val name: String) {
open fun accept(visitor: AnimalVisitor) {
visitor.visit(this)
}
}
class LandAnimal(name: String, val legs: Int) : Animal(name) {
override fun accept(visitor: AnimalVisitor) {
visitor.visit(this)
}
}
class SeaAnimal(name: String, val flippers: Int) : Animal(name) {
override fun accept(visitor: AnimalVisitor) {
visitor.visit(this)
}
}
interface AnimalVisitor {
fun visit(animal: Animal)
fun visit(landAnimal: LandAnimal)
fun visit(seaAnimal: SeaAnimal)
}
class PrintAppendages : AnimalVisitor {
override fun visit(animal: Animal) {
print(" has no appendages")
}
override fun visit(landAnimal: LandAnimal) {
print(" has ${landAnimal.legs} legs")
}
override fun visit(seaAnimal: SeaAnimal) {
print(" has ${seaAnimal.flippers} flippers")
}
}
fun main() {
val lassie = LandAnimal("Lassie", 4)
val nemo = SeaAnimal("Nemo", 2)
PrintAppendages().visit(lassie)
PrintAppendages().visit(nemo)
}
kierans777
03/17/2022, 11:24 PMTim Oltjenbruns
03/18/2022, 12:08 AM