Na linguagem Swift, para inicializar uma instância, é necessário preencher todos os campos dessa classe e somente então chamar superconstrutor:
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)
}
}
Para mim, parece inverso, porque a instância precisa self
ser criada antes da atribuição de valores a seus campos, e esse código dá a impressão de que o encadeamento ocorre apenas após a atribuição. Além disso, a superclasse não possui meios legais de ler os atributos introduzidos de sua subclasse; portanto, a segurança não conta neste caso.
Além disso, muitas outras linguagens, como JavaScript, e até o Objective C, que é um ancestral espiritual do Swift, exigem ligação em cadeia antes do acesso self
, e não depois.
Qual é o motivo por trás dessa escolha para exigir que os campos sejam definidos antes de chamar o superconstrutor?
self
.