Dans le langage Swift, pour initialiser une instance, il faut remplir tous les champs de cette classe, et ensuite seulement appeler superconstructor:
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)
}
}
Pour moi, cela semble à l'envers, car l'instance doit self
être créée avant d'affecter des valeurs à ses champs, et ce code donne l'impression que le chaînage ne se produit qu'après l'affectation. En dehors de cela, la superclasse n'a aucun moyen légal de lire les attributs introduits de sa sous-classe, donc la sécurité ne compte pas dans ce cas.
En outre, de nombreux autres langages, comme JavaScript et même Objective C, qui est un ancêtre quelque peu spirituel de Swift, nécessitent un chaînage d'appel avant d'accéder self
, pas après.
Quel est le raisonnement derrière ce choix pour exiger que les champs soient définis avant d'appeler le superconstructeur?
self
.