Nel linguaggio Swift, per inizializzare un'istanza, è necessario compilare tutti i campi di quella classe e solo allora chiamare 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 al contrario, perché l'istanza deve self
essere creata prima di assegnare valori ai suoi campi e quel codice dà l'impressione come se il concatenamento avvenga solo dopo l'assegnazione. A parte questo, la superclasse non ha mezzi legali per leggere gli attributi introdotti della sua sottoclasse, quindi la sicurezza non conta in questo caso.
Inoltre, molte altre lingue, come JavaScript, e persino l'Obiettivo C, che è in qualche modo un antenato spirituale di Swift, richiedono il concatenamento delle chiamate prima di accedere self
, non dopo.
Qual è il ragionamento alla base di questa scelta per richiedere che i campi siano definiti prima di chiamare il supercostruttore?
self
.