Covariance in Kotlin

Implementation of https://www.linkedin.com/pulse/factory-method-pattern-kotlin-generics-v%C3%ADctor-mart%C3%ADn-molina/ using Covariance (now you can define functions like “someFunWithMagicRoom” thanks to “out T: Room”):

package org.myorg.generic

fun main(args: Array<String>) {
    val ordinaryGame = OrdinaryMazeGame()
    val magicGame = MagicMazeGame()
}

abstract class Room {
    fun connect(room: Room) {
    }
}

class MagicRoom : Room()

class OrdinaryRoom : Room()

class MagicMazeGame : MazeGame<MagicRoom>() {
    override fun makeRoom(): MagicRoom = MagicRoom()
}

class OrdinaryMazeGame : MazeGame<OrdinaryRoom>() {
    override fun makeRoom(): OrdinaryRoom = OrdinaryRoom()
}

fun someFunWithMagicRoom(m: MazeGame<MagicRoom>) {
    someFunWithRoom(m)
}

fun someFunWithRoom(m: MazeGame<Room>) {
}

abstract class MazeGame<out T: Room> {
    private val rooms = mutableListOf<T>()

    init {
        val room1 = makeRoom()
        val room2 = makeRoom()
        room1.connect(room2)
        rooms.add(room1)
        rooms.add(room2)
    }

    protected abstract fun makeRoom(): T
}

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s


A %d blogueros les gusta esto: