【问题标题】:Using of "open" and "public"使用“公开”和“公开”
【发布时间】:2017-01-15 06:11:58
【问题描述】:

我已经阅读了有关新修饰符“open”和“fileprivate”的文档。但是有两点我不明白:

  1. 为什么不能将协议或扩展也声明为“开放”?这是否意味着不能在模块之外使用这些东西?
  2. 如果我不想为一个模块而是一个通用应用程序构建我的类,我应该将我的类和方法声明为“开放”还是只将它们保持“公开”是一种好习惯?

【问题讨论】:

    标签: swift swift3 modifiers


    【解决方案1】:

    正如this answer 所说:

    • 开放​​类可在定义模块之外访问和子类化。开放类成员在定义模块之外是可访问和可覆盖的。
    • 公共类可以访问,但不能在定义模块之外进行子类化。公共类成员在定义模块之外是可访问的,但不可覆盖。

    我认为您的第一个问题的答案是您不能覆盖或子类化协议或扩展。因此,open 这样的东西没有用处,因为public 已经使它们可以在模块外部访问。

    对于您的第二个问题,我想说,如果您打算覆盖或子类化,您应该只将自己的类声明为open。否则,您将允许对这些项目进行不必要的访问。大多数时候public 应该满足您的需求。

    编辑

    正如@Alex 指出的那样,我不认为允许这种“额外访问”有很多缺点。我能想到的唯一一件事是,如果您只是想保护您的课程免受未来自我的影响,但这可能适用也可能不适用。因此,如果不是这种情况,将它们默认设置为 open 应该不会有太大的危害。

    【讨论】:

    • 我宁愿选择open 也会犯错。您无法真正预见其他人想要继承您的类的情况。如果没有理由反对它,就没有理由不默认允许它。
    • 当然,您可能希望公众可以访问您的类的内部工作,但不希望被过度使用(例如,如果这些方法的行为对功能至关重要)类)。在这种情况出现之前,open 是要走的路:)
    • @Alexander 是的,这就是为什么我把它放在首位的原因是 public > open,但你说得对,大多数时候没有必要
    【解决方案2】:

    open 用于另一个模块,例如在我们在单元测试或可可豆荚中使用它时,您可以从豆荚中继承(如果是:open class somePod {...}) 或 override 项目中的某个函数(如果是:open func someFunctionInPod{...})。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 2020-12-20
      • 2015-12-09
      相关资源
      最近更新 更多