首页 > 解决方案 > 开放变量比存储的公共变量有什么用?

问题描述

我检查了一些代码,我遇到了标记为open变量的代码,它是一个存储属性。open在这种情况下有什么样的用途public?这是一些编造的代码:

open class God {
    open var hasSuperPowers = true
}

class HalfGod: God {
    override var hasSuperPowers = false
}

这不编译:Cannot override with a stored property 'hasSuperPowers'。这是因为变量被存储了。

因此,我的问题是:在标记我的存储财产时有什么区别openpublic我可以用存储的属性做一些open我不能用public存储的属性做的事情吗?

我希望xCode会警告我标记hasSuperPowersopen无效,并且会错误地暗示其他人他们可以覆盖这个变量。当然,这仅适用于有人可以向我确认openpublic没有任何区别的情况。

编辑:我现在有三个人向我展示了 open 和 var 之间的区别。我的问题甚至被阅读了吗?再次:

open标记我的存储财产时有什么区别public再次:存储的财产

标签: swift

解决方案


您可以覆盖属性,但不能使用存储的属性。覆盖属性时,您必须使用计算属性,例如:

具有存储属性的类:

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不能从其他模块覆盖属性。


推荐阅读