La parola chiave override in Kotlin è necessaria per indicare esplicitamente la sovrascrittura di metodi e proprietà di una superclasse o di un'interfaccia.
In Java è possibile sovrascrivere i metodi di una superclasse senza la parola chiave, il che a volte può portare a errori o refusi. In Kotlin, seguendo il principio di sicurezza, è necessario specificare override per tutte le sovrascritture e open per il membro stesso della superclasse.
Rischio di nascondere accidentalmente metodi della classe base (accidental overriding) e necessità di gestire esplicitamente i membri ereditati. Inoltre, i metodi sovrascritti devono essere contrassegnati come open, altrimenti non possono essere sovrascritti senza errore di compilazione.
Utilizzare la parola chiave override con metodi e proprietà della superclasse o dell'interfaccia, precedentemente contrassegnati come open, abstract o già override.
Esempio di codice:
open class Animal { open fun sound() = "???" } class Dog : Animal() { override fun sound() = "Woof!" }
Caratteristiche chiave:
override, non è possibile sovrascrivere un metodo — si verifica un errore di compilazione;final in Kotlin, è possibile sovrascrivere solo ciò che è esplicitamente contrassegnato come open;override supporta l'ereditarietà multipla tramite interfacce e classi.È possibile sovrascrivere una proprietà o un metodo se non è contrassegnato come open/abstract/override?
No, solo i membri esplicitamente contrassegnati come open/abstract/override possono essere sovrascritti nella sottoclasse.
È obbligatorio usare override quando si implementa un metodo dell'interfaccia?
Sì, sempre, anche se si tratta del primo livello di implementazione, l'override è obbligatorio — questo è il modo di scrivere Kotlin per coerenza.
Un metodo contrassegnato come override può essere ulteriormente sovrascritto?
Sì, se il metodo non è contrassegnato come final (per impostazione predefinita override eredita open), può essere ulteriormente sovrascritto nella gerarchia.
open nel metodo basale — non è possibile sovrascriverlo, il compilatore genererà un errore;final — impossibile, errore di compilazione.Lo sviluppatore dimentica di mettere open nella classe base:
class Cat { fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" // errore di compilazione }
Vantaggi:
Svantaggi:
override.Corretta definizione della classe e dell'intento di eredità:
open class Cat { open fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" }
Vantaggi:
Svantaggi: