问题标签 [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.
c++ - 在接口中公开方法但在实现中受保护的优点是什么?
在我的 C++ 应用程序中,我有一个如下所示的界面:
我有这个接口的实现,如下所示:
现在我的同事抱怨这个并告诉我最好保护 calculateValue 方法。这样,我们可以保证调用者总是通过接口而不是直接实现。
这是一个正确的观察吗?保护接口的实现真的更好吗?或者我们甚至不能将其设为私有吗?
ruby - 在 ruby 上,为什么 include 是私有的,而 extend 是公共的?
include
在红宝石上,私有的原因是什么,Object#extend
而是公共的?
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
c++ - 基类的“默认”访问说明符差异的基本原理
我知道C++struct
和class
C++ 之间几乎没有区别。我也理解少数差异的原因。像这个,
- 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
(不支持继承),无论你如何派生它。不过我可能是错的。这就是为什么我正在寻求好的解释,可能还有例子!:-)
c++ - 受保护的数据成员和数据函数
当我在一个类中声明一个受保护的数据成员时,这意味着它不能访问外部世界,而是派生类。我的问题是
从派生类派生的类可以访问吗?
c++ - 访问说明符不是万无一失的吗?
如果我有这样的课,
然后我们不能从外部访问 X,所以这是非法的,
但是我们可以在不编辑类的情况下使其可访问!我们需要做的就是这个,
ideone 的工作代码:http ://www.ideone.com/FaGpZ
这意味着,我们可以通过在类定义之前或之前定义此类宏来更改访问说明符#include <headerfile.h>
,
这不是 C++(宏/访问说明符/其他)的问题吗?
无论如何,这个话题的重点是:
使用宏,我们很容易违反封装。访问说明符并非万无一失!我对吗?
c# - 我的 C# Private Class 可以在 DLL 内的任何地方访问,那么 internal 有什么用?
我在 C# 中有 ClassLibrary 项目,并且我的所有“私有类”(在不同的命名空间下)都可以在同一个程序集(项目)内相互访问。
现在 Class1() 可以访问和创建 Class2() 类的实例 [如... new MyClass2App.Class2() ]。是的,这些类(Class1() 和 Class2())在程序集之外是不可访问的。当这些类被设为“内部”时,它的行为相同。有人可以帮助我了解“私有”和“内部”访问说明符在类级别上的实际使用/区别吗?
谢谢!
c++ - 使用 C++0x decltype 绕过访问说明符
考虑以下代码:
编译器拒绝这个 - g 不能返回 A::B 因为 A::B 是私有的。
但是假设我现在使用 decltype 来指定 g 的返回值:
突然之间它编译得很好(使用 g++ >= 4.4)。
所以我基本上使用 decltype 来绕过访问说明符,这是我在 C++98 中无法做到的。
这是故意的吗?这是好习惯吗?
java - Java教程说我可以有一个包私有接口,但我不能
在Java 教程“定义接口”中,它说
如果您没有指定接口是
public
,那么您的接口将只能被定义在与接口相同的包中的类访问。
然而,这
生成编译器错误,NewClass
因为我“试图分配较弱的访问权限;是公开的”。所以文档是错误的,或者我做错了什么,或者我误解了文档?
我想我不必使用界面——我喜欢它,因为它可以让事情井井有条。
c++ - C++ 访问说明符
我只是想确保我了解公共权利和私人权利。
关于私有访问说明符,这是否意味着:
- 只能在类内部访问
- 不能从类的对象访问,除非有可以用来访问它们的公共类方法(其他对象可以使用那些公共函数吗?)
- 没有其他对象可以访问它们
对于公众:
- 从类的对象访问
- 从任何其他对象访问
是对的吗?