ProgrammazioneSviluppatore Kotlin

Qual è la differenza tra la dichiarazione di una classe con la parola chiave 'open' e una classe normale in Kotlin, e come si realizza l'ereditarietà? Fornisci dettagli, caratteristiche ed un esempio di codice.

Supera i colloqui con l'assistente IA Hintsage

Risposta

Per impostazione predefinita, tutte le classi, metodi e proprietà in Kotlin sono finali (final). Ciò significa che non possono essere ereditati o sovrascritti a meno che non venga esplicitamente specificato il modificatore open.

La parola chiave open consente l'ereditarietà della classe o la sovrascrittura del metodo. Questa è una differenza fondamentale rispetto a Java, dove le classi sono per impostazione predefinita aperte all'ereditarietà.

Esempio:

open class Animal { open fun sayHello() { println("Hello from Animal!") } } class Dog : Animal() { override fun sayHello() { println("Woof!") } }
  • Se si rimuove open dalla classe Animal - il tentativo di ereditare causerà un errore di compilazione.
  • override è obbligatorio per i metodi/proprietà che si desidera sovrascrivere.
  • Le interfacce si implementano tramite la parola chiave interface e non richiedono open.

Domanda trabocchetto

In Kotlin è possibile ereditare qualsiasi classe come in Java?

Risposta: No, solo le classi contrassegnate come open (o abstract). Le classi normali sono finalizzate e non possono essere ereditate. Questo è stato fatto per migliorare la sicurezza e la prevedibilità del codice.

Esempio di codice errato:

class Animal class Dog : Animal() // Errore di compilazione: "Animal" è finale

Esempi di veri errori causa della scarsa conoscenza delle peculiarità del tema


Storia

In un progetto per la piattaforma Android, un giovane sviluppatore ha cercato di ereditare un componente personalizzato da una classe View personalizzata, dimenticando di aggiungere open. La build è fallita e la causa era poco chiara, con conseguenti ritardi. Il problema è stato individuato solo dopo una lettura attenta del messaggio del compilatore.


Storia

Durante lo sviluppo di un SDK, la specifica richiedeva una classe base estensibile, ma era stata dichiarata senza open. Dopo la consegna ai clienti, è emerso che la libreria non poteva essere estesa senza modifiche al codice sorgente. È stato necessario rilasciare un aggiornamento.


Storia

In uno dei progetti, il vecchio codice Java è stato migrato a Kotlin, dimenticando la chiusura delle classi per impostazione predefinita. La maggior parte dei test unitari che utilizzavano le simulazioni ha smesso di compilarsi, rallentando il processo di rilascio. Solo dopo l'aggiunta massiccia di open, il problema è stato risolto.