English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Classi Annidate e Classi interne in Kotlin

In questo articolo, imparerai a utilizzare le classi annidate e interne con l'aiuto di esempi.

Classi annidate in Kotlin

Come in Java, Kotlin ti permette di definire una classe all'interno di un'altra classe chiamata classe annidata

class Outer {
    ... .. ...
    class Nested {
        ... .. ...
    }
}

Poiché la classe annidata è un membro esterno della classe di chiusura (Outer), è possibile accedere alla classe annidata e ai suoi membri utilizzando il simbolo .

Esempio: Esempio di utilizzo delle classi annidate in Kotlin

class Outer {
    val a = "All'esterno della classe annidata."
    class Nested {
        val b = "All'interno della classe annidata."
        fun callMe() = "Chiamata di funzione dall'interno della classe annidata."
    }
}
fun main(args: Array<String>) {
    // Accesso ai membri della classe annidata
    println(Outer.Nested().b)
    // Creazione dell'oggetto della classe annidata
    val nested = Outer.Nested()
    println(nested.callMe())
}

L'output del programma quando viene eseguito è:

All'interno della classe annidata.
Chiamata di funzione dall'interno della classe annidata.

Per gli utenti di Java

Le classi annidate in Kotlin sono simili alle classi statiche annidate in Java.

In Java, quando dichiari una classe all'interno di un'altra classe, di default diventa una classe interna. Tuttavia, in Kotlin, devi utilizzare il modificador inner per creare una classe interna, come discuteremo più avanti.

Classi interne in Kotlin

Le classi annidate in Kotlin non hanno il diritto di accedere all'istanza della classe esterna. Ad esempio:

class Outer {
    val foo = "All'esterno della classe annidata."
    class Nested {
        // Errore! Non è possibile accedere ai membri della classe esterna.
        fun callMe() = foo
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println(outer.Nested().callMe())
}

Il codice sopra non può essere compilato perché stiamo cercando di accedere all'attributo foo della classe esterna dall'interno della classe annidata.

Per risolvere questo problema, devi utilizzare il marcatore inner per creare una classe interna. La classe interna porta con sé un riferimento alla classe esterna e può accedere ai membri della classe esterna.

Esempio: Utilizzo delle classi interne in Kotlin

class Outer {
    val a = "All'esterno della classe annidata."
    inner class Inner {
        fun callMe() = a
    }
}
fun main(args: Array<String>) {
    val outer = Outer()
    println("Utilizzo dell'Oggetto Esterno: ${outer.Inner().callMe()}")
    val inner = Outer().Inner()
    println("Utilizzo dell'Oggetto Interno: ${inner.callMe()}")
}

L'output del programma quando viene eseguito è:

Utilizzo dell'Oggetto Esterno: All'esterno della classe annidata.
Utilizzo dell'Oggetto Interno: All'esterno della classe annidata.