W języku Swift, aby zainicjować instancję, należy wypełnić wszystkie pola tej klasy, a dopiero potem wywołać superkonstruktor:
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)
}
}
Dla mnie wydaje się to odwrócone, ponieważ instancja musi self
zostać utworzona przed przypisaniem wartości do jej pól, a ten kod sprawia wrażenie, jakby tworzenie łańcuchów następowało dopiero po przypisaniu. Poza tym nadklasa nie ma legalnych możliwości odczytania wprowadzonych atrybutów podklasy, więc bezpieczeństwo nie ma w tym przypadku znaczenia.
Ponadto wiele innych języków, takich jak JavaScript, a nawet Cel C, który jest nieco duchowym przodkiem Swifta, wymaga połączenia łańcuchowego przed uzyskaniem dostępu self
, a nie później.
Jakie jest uzasadnienie tego wyboru, aby wymagać zdefiniowania pól przed wywołaniem superkonstruktora?
self
.