swift - 开放变量比存储的公共变量有什么用?
问题描述
我检查了一些代码,我遇到了标记为open
变量的代码,它是一个存储属性。open
在这种情况下有什么样的用途public
?这是一些编造的代码:
open class God {
open var hasSuperPowers = true
}
class HalfGod: God {
override var hasSuperPowers = false
}
这不编译:Cannot override with a stored property 'hasSuperPowers'
。这是因为变量被存储了。
因此,我的问题是:在标记我的存储财产时有什么区别open
或public
?我可以用存储的属性做一些open
我不能用public
存储的属性做的事情吗?
我希望xCode
会警告我标记hasSuperPowers
为open
无效,并且会错误地暗示其他人他们可以覆盖这个变量。当然,这仅适用于有人可以向我确认open
或public
没有任何区别的情况。
编辑:我现在有三个人向我展示了 open 和 var 之间的区别。我的问题甚至被阅读了吗?再次:
open
标记我的存储财产时有什么区别public
?再次:存储的财产
解决方案
您可以覆盖属性,但不能使用存储的属性。覆盖属性时,您必须使用计算属性,例如:
具有存储属性的类:
open class God {
open var hasSuperPowers = true
}
该属性只能用计算属性覆盖:
class HalfGod: God {
override var hasSuperPowers: Bool {
didSet {
print("\(oldValue) -> \(hasSuperPowers)")
}
}
}
或者
class HalfGod: God {
var hasPowers: Bool = false
override var hasSuperPowers: Bool {
get {
return hasPowers
}
set {
hasPowers = newValue
}
}
}
只有当其他模块是open
. public
不能从其他模块覆盖属性。
推荐阅读
- javascript - 我无法在 mongodb 服务器中添加第一个用户
- fortran - 用 fortran 编写的 read 语句中的隐含 do 语句
- docker - docker server (kong) 启动后运行 curl 命令
- jenkins - Azure DevOps 队列 Jenkins 步骤在完成前挂起
- reactjs - 为什么我得到“未定义不是对象(评估“inputRef.current.incFont”?
- java - 他们是一种在 apache camel(activemq) 中的消息处理之间添加延迟的方法吗
- purescript - 如何在任何字段中使用带有 JSON 的 Data.Argonaut.Decode 模块?
- asp.net - 如何更新实体尽管该行已加载到 EF 更改跟踪器中或未在实体框架中?
- rust - 我们如何解决有条件返回字符串切片时发生的这个生命周期错误?
- php - 交替行背景取决于 Laravel 中的变化值