Für mich funktioniert Ihr Beispiel in Swift 3.0.1 nicht.
Ich habe auf dem Spielplatz diesen Code eingegeben:
class Jedi {
let lightsaberColor = "Blue"
}
class Sith: Jedi {
override var lightsaberColor : String {
return "Red"
}
}
Wirft beim Kompilieren einen Fehler in Xcode:
kann unveränderliche 'let'-Eigenschaft' Lichtschwertfarbe 'nicht mit dem Getter eines' var 'überschreiben.
Nein, Sie können den Typ der gespeicherten Eigenschaft nicht ändern. Das Liskov-Substitutionsprinzip zwingt Sie dazu, zuzulassen, dass eine Unterklasse an einem Ort verwendet wird, an dem die Oberklasse gewünscht wird.
Wenn Sie es jedoch in die berechnete Eigenschaft ändern var
und daher hinzufügen set
, können Sie die gespeicherte Eigenschaft mit einer berechneten Eigenschaft desselben Typs überschreiben.
class Jedi {
var lightsaberColor = "Blue"
}
class Sith: Jedi {
override var lightsaberColor : String {
get {
return "Red"
}
set {
// nothing, because only red is allowed
}
}
}
Dies ist möglich, weil es sinnvoll sein kann, von einer gespeicherten Eigenschaft zu einer berechneten Eigenschaft zu wechseln.
Das Überschreiben einer gespeicherten var
Eigenschaft mit einer gespeicherten var
Eigenschaft ist jedoch nicht sinnvoll, da Sie nur den Wert der Eigenschaft ändern können.
Sie können eine gespeicherte Eigenschaft jedoch überhaupt nicht mit einer gespeicherten Eigenschaft überschreiben.
Ich würde nicht sagen, dass Sith Jedi sind :-P. Daher ist es klar, dass dies nicht funktionieren kann.