Ako je v Kotlinu organizované dedičstvo a polymorfizmus?
sobes.tech AI
Odpoveď od AI
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 су 'finalne', што значи да не могу бити наследене. Да би се дозволило nasleđivanje, класа мора бити експлицитно означена кључном речју open.
Наслеђивање класа:
open class Shape { // Основна класа, означена као open
open fun draw() { // Метод који може бити преписан
println("Drawing a shape")
}
}
class Circle : Shape() { // Наслеђивање од Shape
override fun draw() { // Преписивање метода
println("Drawing a circle")
}
}
У конструктору наследне класе је потребно позвати конструктор основне класе, експлицитно или нејасно.
Интерфејси:
Интерфејси у Kotlinu су слични онима у Java 8 и могу садржати апстрактне методе и реализоване методе са телом. Класe могу реализовати један или више интерfeјса.
interface Drawable {
fun draw() // Апстрактна метода
fun description() { // Метод са подразумеваном реализацијом
println("This is a drawable object")
}
}
class Square : Drawable {
override fun draw() { // Реализација апстрактне методе
println("Drawing a square")
}
// description() може бити преписана, али није обавезна
}
Полиморфизам:
Полиморфизам у Kotlinu се постиже тиме што можете радити са објектима различитих класа преко заједничког основног типа (класа или интерfeјс). Ово омогућава позивање метода који су специфични за конкретан тип објекта током извршавања.
fun render(drawable: Drawable) {
drawable.draw() // Позив методе draw() у зависности од стварног типа објекта
drawable.description()
}
fun main() {
val circle: Shape = Circle() // Објекат Circle се третира као Shape
circle.draw() // Позив draw() из Circle због полиморфизма
val square: Drawable = Square() // Објекат Square се третира као Drawable
render(square) // Позив draw() и description() из Square
}
У овом примеру, render ради са било којим објектом који реализује Drawable. Позив drawable.draw() ће извршити реализацију методе draw за конкретан тип објекта (Square у овом случају).
Разлика између наслеђивања класа и реализовања интерfeјса:
- Наслеђивање класе: Успоставља однос "је" (is-a). Подкласа наслеђује стање и понашање основне класе.
- Реализација интерfeјса: Дефинише "способност" или "уговор". Класа обећава да ће пружити реализацију за све апстрактне методе интерfeјса.
Табела поређења:
| Карактеристика | Наслеђивање класе | Реализација интерfeјса |
|---|---|---|
| Тип везе | is-a | Способност / Уговор |
| Многострукост | Једнострано | Многоструко |
| Стање | Наслеђује стање основне класе | Не наслеђује стање |
| Реализација метода | Може садржати реализацију | Може садржати подразумевану реализацију (од Java 8) |