Nella lingua Swift, per inizializzare un'istanza, è necessario compilare tutti i campi di quella classe e solo successivamente chiamare il supercostruttore:
class Base {
var name: String
init(name: String) {
self.name = name
}
}
class Derived: Base {
var number: Int
init(name: String, number: Int) {
// won't compile if interchange lines
self.number = number
super.init(name)
}
}
Per me sembra indietro, perché l'istanza ha bisogno di self
per essere creata prima di assegnare valori ai suoi campi, e quel codice dà un'impressione come se il concatenamento avvenga solo dopo l'assegnazione. A parte questo, la superclasse non ha mezzi legali per leggere gli attributi introdotti dalla sottoclasse, quindi la sicurezza non conta in questo caso.
Inoltre, molti altri linguaggi, come JavaScript e persino l'Objective C, che è in qualche modo un antenato spirituale di Swift, richiedono una chiamata di concatenamento prima di accedere a self
, non dopo.
Qual è il ragionamento alla base di questa scelta per richiedere la definizione dei campi prima di chiamare il supercostruttore?