Per me, il tuo esempio non funziona in Swift 3.0.1.
Ho inserito nel playground questo codice:
class Jedi {
let lightsaberColor = "Blue"
}
class Sith: Jedi {
override var lightsaberColor : String {
return "Red"
}
}
Genera un errore in fase di compilazione in Xcode:
non può sovrascrivere la proprietà immutabile "let" "lightsaberColor" con il getter di un "var"
No, non è possibile modificare il tipo di proprietà memorizzata. Il principio di sostituzione di Liskov ti obbliga a consentire che una sottoclasse venga utilizzata in un luogo in cui si desidera la superclasse.
Ma se lo si modifica in var
e quindi si aggiunge set
nella proprietà calcolata, è possibile sovrascrivere la proprietà memorizzata con una proprietà calcolata dello stesso tipo.
class Jedi {
var lightsaberColor = "Blue"
}
class Sith: Jedi {
override var lightsaberColor : String {
get {
return "Red"
}
set {
// nothing, because only red is allowed
}
}
}
Ciò è possibile perché può avere senso passare dalla proprietà memorizzata alla proprietà calcolata.
Ma sostituire una var
proprietà archiviata con una var
proprietà archiviata non ha senso, perché è possibile modificare solo il valore della proprietà.
Tuttavia, non è possibile sovrascrivere affatto una proprietà archiviata con una proprietà archiviata.
Non direi che i Sith sono Jedi :-P. Quindi è chiaro che questo non può funzionare.