Študijné materiály

Rozhranie (interface) definuje spoločné správanie pre triedy. Na rozdiel od abstraktnej triedy nemôže mať konštruktor ani atribúty (len default hodnoty):

interface Drivable {
    fun drive()
}

interface Flyable {
    fun fly()
}

class Car : Drivable {
    override fun drive() {
        println("Jazdim po ceste")
    }
}

class Airplane : Drivable, Flyable {
    override fun drive() {
        println("Taxim na runway")
    }

    override fun fly() {
        println("Letim vo vzduchu")
    }
}

fun main() {
    val car = Car()
    car.drive()  // Jazdim po ceste

    val plane = Airplane()
    plane.drive() // Taxim na runway
    plane.fly()   // Letim vo vzduchu
}

12.1.1 Default implementácia

Rozhranie môže mať default implementáciu funkcií:

interface Loggable {
    fun log(message: String) {
        println("[LOG] $message")
    }
}

class User(val name: String) : Loggable {
    fun greet() {
        log("User $name was greeted")  // pouzijeme default implementaciu
    }
}

fun main() {
    val user = User("Janko")
    user.greet() // [LOG] User Janko was greeted
}

12.1.2 Rozhranie s atribútmi

Rozhranie môže definovať atribúty, ale len abstraktné alebo s default implementáciou:

interface Identifiable {
    val id: Int           // abstraktny atribut
    val type: String get() = "default"  // default implementacia
}

class User(val id: Int, val name: String) : Identifiable {
    override val type: String = "user"
}

fun main() {
    val user = User(1, "Janko")
    println(user.id)   // 1
    println(user.type) // user
}

Rozhranie nemôže mať konštruktor - na rozdiel od abstraktnej triedy.

Úlohy

Úloha 1

Vytvor rozhranie Ulozitelne s metódou uloz a implementuj ho v triede Dokument.

Úloha 2

Vytvor triedu, ktorá implementuje dve rozhrania s rôznymi metódami.

Úloha 3

Doplň rozhranie Logovatelne o predvolenú metódu a zavolaj ju z implementujúcej triedy.