问题标签 [access-specifier]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
435 浏览

c++ - 在接口中公开方法但在实现中受保护的优点是什么?

在我的 C++ 应用程序中,我有一个如下所示的界面:

我有这个接口的实现,如下所示:

现在我的同事抱怨这个并告诉我最好保护 calculateValue 方法。这样,我们可以保证调用者总是通过接口而不是直接实现。

这是一个正确的观察吗?保护接口的实现真的更好吗?或者我们甚至不能将其设为私有吗?

0 投票
3 回答
2864 浏览

ruby - 在 ruby​​ 上,为什么 include 是私有的,而 extend 是公共的?

include在红宝石上,私有的原因是什么,Object#extend而是公共的?

0 投票
7 回答
38394 浏览

ruby - 理解 Ruby 中的私有方法

这当然行不通,因为我们指定了明确的接收者——Example ( e) 的实例,这违反了“私人规则”。

但我无法理解,为什么不能在 Ruby 中这样做:

方法定义中的当前对象public_m(即self)是 Foo 的实例。那么为什么不允许呢?要解决这个问题,我必须更改self.private_m为 just private_m。但是为什么会有所不同,self里面不是 Foo 的一个实例public_m吗?谁是空话private_m呼叫的接收者?不是self吗 - 实际上你省略了什么,因为 Ruby 会为你做这件事(会在 self 上调用 private_m)?

我希望我没有把它混淆太多,我对 Ruby 还是很陌生。


编辑:谢谢你的所有答案。将它们放在一起,我能够(最终)理解显而易见的(对于从未见过像 Ruby 这样的东西的人来说并不那么明显):它self本身可以是显式和隐式接收器,并且会有所作为。因此,如果要调用私有方法,有两条规则:self必须是隐式接收者,并且 self 必须是当前类的实例(Example在这种情况下 - 并且仅当 self 如果在实例方法定义中,在此期间发生方法执行)。如果我错了,请纠正我。

给在谷歌追踪期间可以找到这个问题的任何人的消息:这可能会有所帮助 - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby

0 投票
2 回答
1689 浏览

c++ - 基类的“默认”访问说明符差异的基本原理

我知道C++structclassC++ 之间几乎没有区别。我也理解少数差异的原因。像这个,

  • struct 的成员默认是 public 的;类的成员 默认是私有的struct 的成员默认是 public 的原因是为了C++-struct兼容C-struct. 而类成员之所以默认是私有的,是为了引入数据封装的概念(即执行面向对象的原则/技术/等)。

我不明白的是,引用标准 $11.2/2 [class.access.base]

如果基类没有访问说明符,则在派生类声明为 struct 时假定为 public,而在声明类时假定为 private。

这种扭曲和反统一的理由是什么?为什么需要这种差异?

标准中的示例,

这里 B 是 D2、D4 和 D6 的公共基础,D1、D3 和 D5 的私有基础,以及 D7 和 D8 的受保护基础。


编辑

你们中的一些人可能会说,鉴于 struct 和 class 的默认访问权限不同(上面的要点中给出的差异),这种差异是有意义的。但我认为,inherited-struct完全不兼容C-struct(不支持继承),无论你如何派生它。不过我可能是错的。这就是为什么我正在寻求好的解释,可能还有例子!:-)

0 投票
2 回答
4122 浏览

c++ - 受保护的数据成员和数据函数

当我在一个类中声明一个受保护的数据成员时,这意味着它不能访问外部世界,而是派生类。我的问题是

从派生类派生的类可以访问吗?

0 投票
5 回答
796 浏览

c++ - 访问说明符不是万无一失的吗?

如果我有这样的课,

然后我们不能从外部访问 X,所以这是非法的,

但是我们可以在不编辑类的情况下使其可访问!我们需要做的就是这个,

ideone 的工作代码:http ://www.ideone.com/FaGpZ

这意味着,我们可以通过在类定义之前或之前定义此类宏来更改访问说明符#include <headerfile.h>

这不是 C++(宏/访问说明符/其他)的问题吗?

无论如何,这个话题的重点是:

使用宏,我们很容易违反封装。访问说明符并非万无一失!我对吗?

0 投票
3 回答
4100 浏览

c# - 我的 C# Private Class 可以在 DLL 内的任何地方访问,那么 internal 有什么用?

我在 C# 中有 ClassLibrary 项目,并且我的所有“私有类”(在不同的命名空间下)都可以在同一个程序集(项目)内相互访问。

现在 Class1() 可以访问和创建 Class2() 类的实例 [如... new MyClass2App.Class2() ]。是的,这些类(Class1() 和 Class2())在程序集之外是不可访问的。当这些类被设为“内部”时,它的行为相同。有人可以帮助我了解“私有”和“内部”访问说明符在类级别上的实际使用/区别吗?

谢谢!

0 投票
1 回答
308 浏览

c++ - 使用 C++0x decltype 绕过访问说明符

考虑以下代码:

编译器拒绝这个 - g 不能返回 A::B 因为 A::B 是私有的。

但是假设我现在使用 decltype 来指定 g 的返回值:

突然之间它编译得很好(使用 g++ >= 4.4)。

所以我基本上使用 decltype 来绕过访问说明符,这是我在 C++98 中无法做到的。

这是故意的吗?这是好习惯吗?

0 投票
3 回答
36104 浏览

java - Java教程说我可以有一个包私有接口,但我不能

Java 教程“定义接口”中,它说

如果您没有指定接口是public,那么您的接口将只能被定义在与接口相同的包中的类访问。

然而,这

生成编译器错误,NewClass因为我“试图分配较弱的访问权限;是公开的”。所以文档是错误的,或者我做错了什么,或者我误解了文档?

我想我不必使用界面——我喜欢它,因为它可以让事情井井有条。

0 投票
5 回答
1794 浏览

c++ - C++ 访问说明符

我只是想确保我了解公共权利和私人权利。

关于私有访问说明符,这是否意味着:

  • 只能在类内部访问
  • 不能从类的对象访问,除非有可以用来访问它们的公共类方法(其他对象可以使用那些公共函数吗?
  • 没有其他对象可以访问它们

对于公众:

  • 从类的对象访问
  • 从任何其他对象访问

是对的吗?