我注意到编译器不允许我用另一个存储值覆盖存储的属性(这看起来很奇怪):
class Jedi {
var lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor = "Red" // Cannot override with a stored property lightSaberColor
}
但是,我可以使用计算属性来执行此操作:
class Jedi {
let lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor : String{return "Red"}
}
为什么我不允许给它另一个值?
为什么用存储的属性覆盖是一种令人厌恶的行为,而用计算出来的属性来覆盖却是一种令人厌恶的行为?他们在想什么?
为什么我不允许给它另一个值?
您绝对可以为继承的财产赋予不同的值。如果您在采用该初始值的构造函数中初始化该属性,并传递来自派生类的不同值,则可以做到这一点:
class Jedi {
// I made lightSaberColor read-only; you can make it writable if you prefer.
let lightSaberColor : String
init(_ lsc : String = "Blue") {
lightSaberColor = lsc;
}
}
class Sith : Jedi {
init() {
super.init("Red")
}
}
let j1 = Jedi()
let j2 = Sith()
print(j1.lightSaberColor)
print(j2.lightSaberColor)
覆盖属性与赋予它新值不同 - 它更像是为类赋予不同的属性。事实上,这就是当您重写计算属性时会发生的情况:计算基类中的属性的代码是replaced通过计算派生类中该属性的重写的代码。
[是否]可以覆盖实际存储的属性,即lightSaberColor
那还有其他行为吗?
除了观察者之外,存储的属性没有行为,因此实际上没有什么可以覆盖的。通过上述机制可以为属性赋予不同的值。这正是问题中的示例试图通过不同的语法实现的目标。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)