Sobes.tech
Junior

Kako je organizovano nasleđivanje i polimorfizam u Kotlinu?

sobes.tech АИ

Одговор од АИ

U Kotlinu, nasleđivanje se realizuje putem mehanizma klasa i interfejsa. Klase mogu nasleđivati samo jednu drugu klasu (jednostruko nasleđivanje), ali mogu implementirati više interfejsa.

Podrazumevano, sve klase u Kotlinu su 'finalne', što znači da ne mogu biti nasledjene. Da bi se dozvolilo nasleđivanje, klasa mora biti eksplicitno označena ključnom rečju open.

Nasleđivanje klasa:

open class Shape { // Osnovna klasa, označena kao open
    open fun draw() { // Metod koji može biti prepisan
        println("Drawing a shape")
    }
}

class Circle : Shape() { // Nasleđivanje od Shape
    override fun draw() { // Prepisivanje metode
        println("Drawing a circle")
    }
}

U konstruktoru izvedene klase je potrebno pozvati konstruktor osnovne klase, eksplicitno ili implicitno.

Interfejsi:

Interfejsi u Kotlinu su slični onima u Java 8 i mogu sadržavati apstraktne metode i implementirane metode sa telom. Klase mogu implementirati jedan ili više interfejsa.

interface Drawable {
    fun draw() // Apstraktna metoda
    fun description() { // Metod sa podrazumevanom implementacijom
        println("This is a drawable object")
    }
}

class Square : Drawable {
    override fun draw() { // Implementacija apstraktne metode
        println("Drawing a square")
    }
    // description() može biti prepisan, ali nije obavezno
}

Polimorfizam:

Polimorfizam u Kotlinu se postiže mogućnošću rada sa objektima različitih klasa preko zajedničkog osnovnog tipa (klase ili interfejsa). To omogućava pozivanje metoda specifičnih za konkretan tip objekta tokom izvršavanja.

fun render(drawable: Drawable) {
    drawable.draw() // Pozivanje metode draw() u zavisnosti od stvarnog tipa objekta
    drawable.description()
}

fun main() {
    val circle: Shape = Circle() // Objekat Circle tretira se kao Shape
    circle.draw() // Pozivanje draw() iz Circle zbog polimorfizma

    val square: Drawable = Square() // Objekat Square tretira se kao Drawable
    render(square) // Pozivanje draw() i description() iz Square
}

U ovom primeru, render radi sa bilo kojim objektom koji implementira Drawable. Poziv drawable.draw() će izvršiti implementaciju metode draw za konkretan tip objekta (Square u ovom slučaju).

Razlika između nasleđivanja klasa i implementacije interfejsa:

  • Nasleđivanje klase: Uspostavlja odnos "je" (is-a). Podklasa nasleđuje stanje i ponašanje osnovne klase.
  • Implementacija interfejsa: Definiše "sposobnost" ili "ugovor". Klasa obećava da će pružiti implementaciju za sve apstraktne metode interfejsa.

Tabela poređenja:

Osobina Nasleđivanje klase Implementacija interfejsa
Tip veze is-a Sposobnost / Ugovor
Mogućnost više Jednokratno Višestruko
Stanje Nasleđuje stanje osnovne klase Ne nasleđuje stanje
Implementacija metoda Može sadržavati implementaciju Može sadržavati podrazumevanu implementaciju (od Java 8)