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) |