【发布时间】:2017-01-15 06:11:58
【问题描述】:
我已经阅读了有关新修饰符“open”和“fileprivate”的文档。但是有两点我不明白:
- 为什么不能将协议或扩展也声明为“开放”?这是否意味着不能在模块之外使用这些东西?
- 如果我不想为一个模块而是一个通用应用程序构建我的类,我应该将我的类和方法声明为“开放”还是只将它们保持“公开”是一种好习惯?
【问题讨论】:
我已经阅读了有关新修饰符“open”和“fileprivate”的文档。但是有两点我不明白:
【问题讨论】:
正如this answer 所说:
我认为您的第一个问题的答案是您不能覆盖或子类化协议或扩展。因此,open 这样的东西没有用处,因为public 已经使它们可以在模块外部访问。
对于您的第二个问题,我想说,如果您打算覆盖或子类化,您应该只将自己的类声明为open。否则,您将允许对这些项目进行不必要的访问。大多数时候public 应该满足您的需求。
编辑:
正如@Alex 指出的那样,我不认为允许这种“额外访问”有很多缺点。我能想到的唯一一件事是,如果您只是想保护您的课程免受未来自我的影响,但这可能适用也可能不适用。因此,如果不是这种情况,将它们默认设置为 open 应该不会有太大的危害。
【讨论】:
open 也会犯错。您无法真正预见其他人想要继承您的类的情况。如果没有理由反对它,就没有理由不默认允许它。
open 是要走的路:)
public > open,但你说得对,大多数时候没有必要
open 用于另一个模块,例如在我们在单元测试或可可豆荚中使用它时,您可以从豆荚中继承(如果是:open class somePod {...}) 或 override 项目中的某个函数(如果是:open func someFunctionInPod{...})。
【讨论】: