In der Sprache Swift muss man zum Initialisieren einer Instanz alle Felder dieser Klasse ausfüllen und erst dann den Superkonstruktor aufrufen:
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)
}
}
Für mich scheint es rückwärts zu sein, da die Instanz self
vor dem Zuweisen von Werten zu ihren Feldern erstellt werden muss und dieser Code den Eindruck erweckt, als ob die Verkettung erst nach der Zuweisung erfolgt. Abgesehen davon hat die Oberklasse keine legalen Mittel, um die eingeführten Attribute ihrer Unterklasse zu lesen, sodass die Sicherheit in diesem Fall nicht zählt.
Viele andere Sprachen, wie JavaScript und sogar Objective C, das ein etwas spiritueller Vorfahr von Swift ist, erfordern vor dem Zugriff einen Verkettungsaufruf self
, nicht danach.
Was ist der Grund für diese Wahl, dass die Felder definiert werden müssen, bevor der Superkonstruktor aufgerufen wird?
self
.