如果我将创建一个如下所示的新对象,默认情况下它具有哪个访问修饰符?
Object objectA = new Object();
Run Code Online (Sandbox Code Playgroud) 我是C++新手,我有很多关于OO语言的经验,比如C/C#/ Objective-C.现在,我正在学习C++.
我看到了这个C++代码:
class World : public State
{
};
Run Code Online (Sandbox Code Playgroud)
似乎World类State公开继承了这个类.公共子类化?这很难理解.
这个功能的概念是什么?什么时候有用或需要?
这不能按预期工作(因为我试图run从外部调用包私有Services):
object Services {
class HelloPrinter {
private[Services] def run = "Hello"
}
}
val obj = new Services.HelloPrinter
Run Code Online (Sandbox Code Playgroud)
但是,令人惊讶的是这有效:
val obj: {def run: String} = new Services.HelloPrinter
obj.run
Run Code Online (Sandbox Code Playgroud)
我会说,它是编译器中的一个错误,因为HelloPrinter由于包可见性规则而与结构类型不匹配,所以它根本不应该编译!
这是程序编译但抛出运行时异常(java.lang.NoSuchMethodException)的情况:
class HelloPrinter {
private[HelloPrinter] def run = "Hello"
}
val obj: {def run: String} = new HelloPrinter
obj.run
Run Code Online (Sandbox Code Playgroud)
这是我缺少的语言功能或规则,还是合法的Scala中的错误?
reflection scala access-modifiers nosuchmethoderror structural-typing
由于Jigsaw项目的核心是Java模块系统,因此能够仅限制对特定模块内特定程序元素(类,方法和字段)的访问是很好的.
当模块中的某些元素对于此模块基本上是公共的时,它可能会有所帮助,但不应在此模块外部访问.
所以我说的是"package-local"之后的下一级访问,可以命名为"module-local".
然而,简要介绍Jigsaw规则和早期规范并没有帮助我弄清楚这种功能.更具体地说,该Modifier规范不包含任何新元素.
那么在未来的Java 9中还有其他任何可能吗?
下面的示例代码在Visual C++中编译得很好:
class Test {
private:
struct {
struct {
int privateData;
};
};
};
int main(int, char **)
{
Test test;
test.privateData = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但为什么?我期望编译器错误,因为privateData函数main应该无法访问该成员,因为它应该private像它的容器容器一样.我知道无名结构不是官方C++的一部分,但这个设计是asinine.
顺便说一句,我也试图改变private成protected和struct成union:它看起来像编译器拒绝兑付匿名结构和联合嵌套在另一个匿名结构或联合内部的访问修饰符.
有人可以解释这个功能吗?
当我建立时,VS显示错误.这是我的代码:
public Composite buildComposite(ComboBox subs, ComboBox bas)
{
int count = 0;
Composite a = new Composite();
if (subs.SelectedItem != null)
{
foreach (Substance d in listSubstance)
{
if (String.Compare(d.notation, subs.Text) == 0)
{
count++;
a.subs = new Substance(d);
break;
}
}
}
if (bas.SelectedItem != null)
{
foreach (Base g in listBase)
{
if (String.Compare(g.notation, bas.Text) == 0)
{
count++;
a.bas = new Base(g);
break;
}
}
}
if (count > 0)
{
a.equilibrium();
a.settypesubs(arrayDefinition);
return a;
}
else …Run Code Online (Sandbox Code Playgroud) 我有一个包含两个软件包的库项目,分别是package1和package2,分别是class1和class2.class1有一些公共方法暴露给最终用户.我想在class1中添加一些只有class2才能访问的实用方法.我搜索了很多,但我找不到任何访问修饰符的方法只授予相同项目的不同包的访问权限.
有机会以任何方式实现它吗?
更新(代码示例):
package1中的Class1:
package com.example.package1;
public class Class1 {
// This method should only be accessed by Class2, cannot made it public for
// every class
void performUtilityOperation() {
// internal utility
}
// other public methods...
}
Run Code Online (Sandbox Code Playgroud)
package2中的class2:
package com.example.package2;
import com.example.package1.*;
public class Class2 {
Class1 class1;
public void setClass1(Class1 class1) {
this.class1 = class1;
}
public void doSomeOperation() {
this.class1.performUtilityOperation(); // here this method is not
// accessible if not public
// do some other operations …Run Code Online (Sandbox Code Playgroud) 致力于混合框架.在Obj-C文件中导入,但内部类不可见,只有公共类.
文档清楚地说明Swift和Obj-C之间应该有内部分支:
将Swift导入Objective-C
要在与Objective-C代码相同的框架目标中导入一组Swift文件,您不需要将任何内容导入到框架的伞形头中.相反,将您的Swift代码的Xcode生成的头文件导入到您想要使用Swift代码的任何Objective-C .m文件中.因为框架目标的生成标头是框架公共接口的一部分,所以只有标记为public修饰符的声明才会出现在框架目标的生成标头中.您仍然可以在框架的Objective-C部分中使用使用内部修饰符标记的Swift方法和属性,只要它们在从Objective-C类继承的类中声明即可.有关访问级别修饰符的更多信息,请参阅 Swift编程语言(Swift 2)中的访问控制.
代码示例(使用框架创建新项目)
// SwiftObject.swift
public class SwiftObject: NSObject {
public class func doSomething() {}
}
internal class YetAnotherSwiftObject: NSObject {
internal class func doSomething() {}
}
Run Code Online (Sandbox Code Playgroud)
// SomeObject.m file
@implementation SomeObject
- (void)someMethod {
[SwiftObject doSomething];
}
- (void)someOtherMethod {
[YetAnotherSwiftObject doSomething]; // Use of undeclared identifier
}
@end
Run Code Online (Sandbox Code Playgroud) 我正在使用此代码
type
TSomeClass = class(TOBject)
private
class var InstanceCount : integer;
class var TotalInstanceCount : integer;
public
class function instances: integer;
class function totalInstances: integer;
constructor Create;
destructor Destroy;
end;
constructor TSomeClass.Create;
begin
inherited Create;
Inc(InstanceCount);
Inc(TotalInstanceCount);
end;
destructor TSomeClass.Destroy;
begin
Dec(InstanceCount);
inherited;
end;
class function TSomeClass.instances;
begin
Result := InstanceCount;
end;
class function TSomeClass.totalInstances;
begin
Result := TotalInstanceCount;
end;
Run Code Online (Sandbox Code Playgroud)
我想创建一个实例计数器,并将一些类变量设置为私有.问题很简单,看看这张图:
正如您在红色框中看到的那样,我声明为私有的类变量.我不希望它们出现.我只希望公共类函数能够显示计数器.我能做什么?
I wonder if it is valid C++ :
class Test {
struct PrivateInner {
PrivateInner(std::string const &str) {
std::cout << str << "\n";
}
};
public:
using PublicInner = PrivateInner;
};
//Test::PrivateInner priv("Hello world"); // Ok, private so we can't use that
Test::PublicInner publ("Hello World"); // ?, by using public alias we can access private type, is it ok ?
Run Code Online (Sandbox Code Playgroud) access-modifiers ×10
c++ ×3
c# ×2
java ×2
alias ×1
delphi ×1
frameworks ×1
inheritance ×1
ios ×1
java-9 ×1
java-platform-module-system ×1
nested ×1
object ×1
objective-c ×1
oop ×1
private ×1
reflection ×1
scala ×1
subclassing ×1
swift ×1
winforms ×1