Študijné materiály

Abstraktná trieda je trieda, ktorá nemôže byť priamo instanciovaná. Slúži ako základ pre iné triedy a môže obsahovať abstraktné funkcie (bez implementácie) aj bežné funkcie:

abstract class Shape {
    abstract fun area(): Double
    abstract fun perimeter(): Double

    fun describe() {
        println("Obsah: ${area()}, Obvod: ${perimeter()}")
    }
}

class Rectangle(val width: Double, val height: Double) : Shape() {
    override fun area() = width * height
    override fun perimeter() = 2 * (width + height)
}

class Circle(val radius: Double) : Shape() {
    override fun area() = Math.PI * radius * radius
    override fun perimeter() = 2 * Math.PI * radius
}

fun main() {
    val rect = Rectangle(5.0, 3.0)
    val circle = Circle(4.0)

    rect.describe()    // Obsah: 15.0, Obvod: 16.0
    circle.describe()  // Obsah: 50.265..., Obvod: 25.132...
}

Abstraktná trieda môže mať konštruktor, na rozdiel od rozhrania.

11.1.1 Kedy použiť abstraktnú triedu a kedy rozhranie?

  • Abstraktná trieda: keď máme spoločný kód (atribúty, implementáciu funkcií) medzi podtriedami
  • Rozhranie: keď definujeme spoločné správanie (len abstraktné funkcie alebo default implementácie)
// Abstraktna trieda - ma atributy a konstruktor
abstract class Vehicle(val speed: Int) {
    abstract fun start()
}

// Rozhranie - nema atributy ani konstruktor
interface Drivable {
    fun drive()
}

V jednej triede môžeme dediť len z jednej triedy (aj abstraktnej), ale implementovať viacero rozhraní.

Úlohy

Úloha 1

Vytvor abstraktnú triedu Zamestnanec s abstraktnou metódou na výpočet mzdy.

Úloha 2

Implementuj triedy HodinovyZamestnanec a PevnyZamestnanec, ktoré metódu vypočítajú rozdielne.

Úloha 3

Pridaj do abstraktnej triedy konkrétnu metódu na výpis mena a použi ju v oboch podtriedach.