我是一个以D开头的C++程序员,我在理解D类的访问限定符时遇到了一些麻烦.请考虑以下示例:
import std.stdio;
class Foo {
private void aPrivateMethod()
{
writeln("called aPrivateMethod");
}
protected void aProtectedMethod()
{
writeln("called aProtectedMethod");
}
public void aPublicMethod()
{
this.aPrivateMethod();
this.aProtectedMethod();
}
}
void main(string[] args)
{
Foo foo = new Foo();
foo.aPublicMethod(); // OK to call it from anywhere
foo.aPrivateMethod(); // Must not be allowed to call it outside Foo
foo.aProtectedMethod(); // Should only be callable from within Foo and derived classes
}
Run Code Online (Sandbox Code Playgroud)
我希望以前的代码编译失败,因为它Foo在外部函数中调用类的私有和受保护的方法.但是,情况并非如此,因为上面的示例在DMD v2.063.2上编译并运行时没有错误或警告.显然,关键字与C++的含义不同.
我的问题是:
1)如何使方法和/或变量对类具有私有性,以便只有相关的类才能访问它.
2)如何使方法和/或变量受到保护,以便只有有问题的类及其派生类才能访问它.
访问修饰符是模块/文件级别(仅保护异常)
删除对类的访问权限将其放入自己的mudule中:
餐饮
import std.stdio;
class Foo {
private void aPrivateMethod()
{
writeln("called aPrivateMethod");
}
protected void aProtectedMethod()
{
writeln("called aProtectedMethod");
}
public void aPublicMethod()
{
this.aPrivateMethod();
this.aProtectedMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
main.d
import foo;
void main(string[] args)
{
Foo foo = new Foo();
foo.aPublicMethod(); // OK to call it from anywhere
foo.aPrivateMethod(); // compile error: Must not be allowed to call it outside foo.d
foo.aProtectedMethod(); // compile error: Should only be callable from within foo.d, Foo and derived classes
}
Run Code Online (Sandbox Code Playgroud)