【问题标题】:public static vs open static vs public class vs open class?公共静态 vs 开放静态 vs 公开课 vs 公开课?
【发布时间】:2017-05-08 18:18:35
【问题描述】:

随着在 Swift 3 中引入 open 关键字突然以下是方法的有效范围修饰符:open staticpublic staticopen classpublic class,但它们究竟有什么区别?我知道public 相当于Java 中的public final,允许覆盖open 类方法和变量,但是public class funcopen static func 是什么意思?它们是public static func 的同义词吗?即所有 3 个实现都不允许被子类覆盖?在特定情况下,这 4 种不同排列中的每一种都有独特的优势吗?

【问题讨论】:

    标签: swift swift3 scope overriding


    【解决方案1】:

    这个问题过于复杂,因为您要比较两个变量的笛卡尔积的成员(open vs publicstatic vs class),而不是分别询问这两个变量。

    这不是open static vs public static vs open class vs public class,而是open vs publicstatic vs class的问题。它们是两个正交维度。

    openpublic

    public:

    在模块内,public 访问说明符允许访问覆盖。

    从模块外部,public 访问说明符允许访问,但不允许允许覆盖/子类。

    open:

    在模块中,open 访问说明符允许访问覆盖。

    从模块外部,open 访问说明符允许访问,并且允许覆盖/子类。

    staticclass

    static:

    static 成员(方法或属性)是绑定到定义它的特定范围 (class/struct/enum) 的成员。之所以这样命名,是因为始终可以访问此类成员静态分派。这相当于Java 的static。 Objective C 没有与此等价的。

    class:

    class 成员是绑定到类或其子类的成员。 class 成员可以被子类覆盖。因此,它们在一般情况下是动态分派的,尽管在某些情况下,优化器可以对 class 成员的访问进行去虚拟化。 Java 没有与此等价的东西。这相当于 Objective C 的类 (+) 方法。

    【讨论】:

    • 我什么时候决定是使用public static还是open static
    • @NoodleofDeath 我不认为open static 应该是有效的,但这是出于某种原因。我不确定这是否有意义,因为静态成员不能被覆盖
    • @Hamish 注意,我已经进行了这些更改。你对为什么open static 是一个有效的组合有任何解释吗?
    • @Alexander 据我所知,Swift 团队一直倾向于“允许访问级别的退化组合没有害处”——最值得注意的是能够声明具有更高访问权限的成员级别高于定义它们的类型,例如 private 类中的 public 方法。 Their reasoning for that 是它允许程序员考虑并记录如果该类型被提升到更高的访问级别应该如何对待该成员......
    • ... 我想同样的逻辑也适用于open static,因为如果该成员曾经成为class 成员,那么很明显 API 也打算让它成为可被其他模块覆盖。
    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多