使用“公开”和“公开”

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案1】:

正如this answer 所说:

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

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

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

编辑

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

【讨论】:

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

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

【讨论】:

以上是关于使用“公开”和“公开”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Terraform 公开 gcp 云功能

使用图形在 Facebook 墙上公开发布

msbuild 使用 ProduceOnlyReferenceAssembly 创建作为引用的仅公开成员程序集

使用 spring-boot 和 Weblogic 公开 SOAP Webservice

如何使用 ngrok 公开 React 开发服务器和 websocket 服务器

密码技术的公开密码