与存储的公共变量相比,开放变量有什么用?

时间:2019-03-08 22:40:18

标签: swift

我已经签出了一些代码,并且遇到了一个标记为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无效,并且会错误地向其他人暗示他们可以覆盖此变量。当然,这仅在有人可以确认我openopen没有任何区别的情况下适用。

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

标记publicopen的存储属性有什么区别?再次:存储属性

2 个答案:

答案 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)

从评论中的链接:

在定义模块外部可以访问和子类化开放类。一个开放类的成员可以在定义模块之外访问和覆盖。

在定义模块之外可以访问公共类,但不能将其子类化。公共类成员可以在定义模块之外访问,但不能覆盖。

将我的存储属性标记为公开或公开有什么区别?

  • 如果其标记为public,那么您将无法覆盖定义模块之外的成员。

我可以使用开放式存储属性来执行某些操作,而不能使用公共存储属性吗?

  • 您可以在定义模块之外对它进行子类化。
相关问题