我是一名从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
}
我希望以前的代码编译失败,因为它在外部函数中调用类Foo
的私有和受保护方法。但是,情况并非如此,因为上面的示例在DMD v2.063.2上编译并运行时没有错误或警告。显然,关键字与C ++的含义不同。
我的问题是:
1)如何将方法和/或变量设为私有,以便只有相关的类才能访问它。
2)如何使方法和/或变量受到保护,以便只有相关的类及其派生类才能访问它。
答案 0 :(得分:6)
访问修饰符是模块/文件级别(仅保护异常)
删除对类的访问权限将其置于自己的mudule中:
foo.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();
}
}
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
}
答案 1 :(得分:4)
D与公共私有和受保护的术语的含义略有不同,而不是C ++
Private表示只有封闭类的成员才能访问与封闭类相同的模块中的成员或成员和函数。私人成员不能被覆盖。私有模块成员等同于C程序中的静态声明。
包扩展为private,以便可以从同一包中的其他模块中的代码访问包成员。如果模块位于嵌套包中,则仅适用于最里面的包。
受保护意味着只有封闭类的成员或从该类派生的任何类,或与封闭类在同一模块中的成员和函数才能访问该成员。如果通过派生类成员函数访问受保护的实例成员,则只能为对象实例访问该成员,该对象实例可以隐式转换为与“this”相同的类型。受保护的模块成员是非法的。
公共意味着可执行文件中的任何代码都可以访问该成员。