Temps : 45 min.
Diffiulté : *
L'objectif est de mettre en pratique le concept de :
Il s'agit de créer une classe, une interface contenant une fonction et d'ajouter la délégation sur l'interface.
agua
, créez un nouveau package crab
.
agua.crab
, créez un nouveau fichier HermitAndCrab.kt
CrabAction
:
interface CrabAction {
fun pinch()
}
Crab
, elle implémente l'interface CrabAction
:
class Crab : CrabAction {
override fun pinch() = println("_-<> pinch <>-_")
}
PrintingCrabAction
, elle implémente CrabAction
:
class PrintingCrabAction(val crabAction: String) : CrabAction {
override fun pinch() {
println(crabAction)
}
}
CrabAction
:
class Crab : CrabAction by PrintingCrabAction("_-<> pinch <>-_")
playWithCrab()
pour tester (faites pincer le crabe), appellez là dans un main
Il s'agit de créer une classe, une interface avec propriété, une classe singleton et d'ajouter la délégation sur l'interface via le singleton.
GastropodShell
:
interface GastropodShell {
val shell: String
}
HermitCrab
, elle implémente l'interface GastropodShell
:
class HermitCrab : GastropodShell {
override val shell = "SHELL"
}
playWithCrab()
une instance de HermitCrab
pour tester (affichez la carapace du bernard l'hermite), exécutez le main
Shell
, elle implémente l'interface GastropodShell
:
object Shell : GastropodShell {
override val shell = "((.))"
}
GastropodShell
:
class HermitCrab : GastropodShell by Shell
Il s'agit de créer des listes d'objet afin de mettre en pratique le concept de générique. Aussi il s'agit de créer des classes d'héritage pour mettre en évidence le principe de covariance et contravariance.
agua
, créez un nouveau package beach
.
agua.beach
, créez un nouveau fichier BeachEquipment.kt
BeachEquipment
:
open class BeachEquipment(val name: String) {
fun removeSand() {}
}
Towel
et Umbrella
, des sous classes de BeachEquipment
:
data class Towel(val towelName: String) : BeachEquipment(towelName)
data class Umbrella(val umbrellaName: String) : BeachEquipment(umbrellaName)
main
, créez une liste de Umbrella
, de Towel
et de BeachEquipment
:
fun main() {
val umbrellaList = listOf(Umbrella("Macha umbrella"), Umbrella("Red umbrella"), Umbrella("White Umbrella"))
val towelList = listOf(Towel("Macha Towel"), Towel("Gugus towel"))
val beachParty = umbrellaList + towelList
print(beachParty)
}
removeSand()
prenant en paramètre une liste de BeachEquipment
,
elle s'applique à la classe parent et donc aux sous classes de la classe parent, selon le principe de covariance :
fun removeSand(equipmentList: List<BeachEquipment>) {
equipmentList.forEach {
it.removeSand()
println(it.name + " cleaned !")
}
}
main
, exécutezBeachEquipment.kt
, créez un comparateur de BeachEquipment
:
val compareByNames = Comparator { a: BeachEquipment, b: BeachEquipment ->
a.name.length - b.name.length
}
main
triez les éléments de beachParty
via ce comparateur :
beachParty.sortedWith(compareByNames).forEach(::println)
Finalement, le code Kotlin peut être épuré avec la délégation de :
developer.android.com: Using Classes and Objects in Kotlin
medium.com: Kotlin Covariance and Contravariance