我已经签出了一些代码,并且遇到了一个标记为open
的变量代码,它是一个存储的属性。在这种情况下,open
超过public
有什么样的用途?这是一些编成的代码:
open class God {
open var hasSuperPowers = true
}
class HalfGod: God {
override var hasSuperPowers = false
}
这不能编译:{{1}}。这是因为变量已存储。
因此,我的问题是:标记我的存储属性Cannot override with a stored property 'hasSuperPowers'
或open
有什么区别?我可以用存储的public
做些什么吗?属性,而我无法使用open
存储的属性来做?
我希望public
会警告我,将xCode
标记为hasSuperPowers
无效,并且会错误地向其他人暗示他们可以覆盖此变量。当然,这仅在有人可以确认我open
或open
没有任何区别的情况下适用。
编辑:现在我得到了三个人向我展示open和var之间的区别。我的问题甚至被阅读吗?再次:
标记public
或open
的存储属性有什么区别?再次:存储属性
答案 0 :(得分:1)
您可以覆盖属性,但不能覆盖存储的属性。覆盖属性时,您必须使用计算出的属性,例如:
具有存储属性的类:
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
属性不能从其他模块中覆盖。
答案 1 :(得分:0)
从评论中的链接:
在定义模块外部可以访问和子类化开放类。一个开放类的成员可以在定义模块之外访问和覆盖。
在定义模块之外可以访问公共类,但不能将其子类化。公共类成员可以在定义模块之外访问,但不能覆盖。
将我的存储属性标记为公开或公开有什么区别?
我可以使用开放式存储属性来执行某些操作,而不能使用公共存储属性吗?