Interfejsi

Interfejsi funkcionišu na sličan način kao i u Javi. Dakle, u interfejsu se nalazi kolekcija metoda koje klasa koja implementira taj interfejs mora da implementira. Osnovna sintaksa interfejsa izgleda ovako:

interface ime_interfejsa {
  fun ime_metoda_1(parametri...) {
    naredbe...
  }
}

Da bi klasa implementirala interfejs, mora da implementira sve metode tog interfejsa (preko override) i da naznači da implementira interfejs kao u sledećem primeru:

interface ime_interfejsa {
  fun ime_metoda_1(parametri...) {
    naredbe...
  }
}

class ime_klase(parametri...) : ime_interfejsa {
  naredbe...
}
Dozvoljeno je da klasa implementira više interfejsa, ali treba posebno voditi računa u slučaju kada se pojedini metodi isto nazivaju u dva ili više interfejsa i kada su već implementirani u interfejsu. Tada se mora definisati svoja implemenztacija ili se pozvati neka od implementacija kao u primeru ispod.
class ime_klase(parametri...) : ime_interfejsa_1, ime_interfejsa_2 {
  naredbe...

  fun metod() {
    super<ime_interfejsa_1>.metod()
  }
}

Ovaj deo koda prihvata implementaciju prvog interfejsa metoda koji se nalazi u oba interfejsa.

Data klase

Osim klasa i interfejsa, u Kotlinu postoji i posebna vrsta klasa koja je prilagođena za čuvanje podataka. Takve klase se zovu data klase i veoma su važne kada je u pitanju rad sa bazama podataka. Data klase se definišu isto kao i obične klase, samo što im ispred ključne reči class stoji ključna reč data i svaki parametar u glavnom konstruktoru mora biti val ili var, jer je kompajleru potrebno da zna da li su objekti klase mutabilni ili ne. Ove klase nude nekoliko pogodnosti:

Ovakve klase ne mogu da se nasleđuju, niti mogu da budu apstraktne. U slučaju da je data klasa potklasa neke klase u kojoj su definisani neki od gorenavedenih metoda i tipovi se poklapaju, onda će kompajler već definisane metode preuzeti i neće automatski generisati svoje. Za metode copy() i componentN nije moguće unutar klase ponuditi svoju definiciju.
Recimo, na sledećem primeru smo kreirali klasu Person koja čuva imena ljudi i njihove godine. Primetimo kako se ovaj kod lakše održava nego da smo pisali običnu klasu.

data class Person(val name: String, val surname: String, var age: Int)

fun main() {
  val p = Person("David", "Davidovic", 15)
  println(p.toString())
}

Ukoliko ima potrebe za tim, veoma lako se može iz svakog objekta data klase u jednoj liniji koda izdvojiti svaki atribut klase. Na našem primeru, to funkcioniše ovako:

val (name, surname, age) = p

Svaka od definisanih promenljivih dobija po jedan atribut od objekta p, u onom redu u kojem su ti atributi definisani.