D类的公共、私有和受保护访问限定符 我是一个C++程序员,从D开始,我对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 }

D类的公共、私有和受保护访问限定符 我是一个C++程序员,从D开始,我对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 },class,d,Class,D,我认为前面的代码编译失败,因为它在外部函数中调用类Foo的私有和受保护方法。但是,情况并非如此,因为上面的示例在DMD v2.063.2上编译和运行时没有错误或警告。显然,关键词与C++的含义不同。 我的问题是: 1) 如何使一个方法和/或变量对一个类是私有的,这样只有有问题的类才能访问它 2) 如何使方法和/或变量受到保护,以便只有相关类及其派生类才能访问它。访问修饰符是模块/文件级别的(仅保护异常) 要删除对类的访问,请将其放入自己的mudule中: 食品与药物 main.d import

我认为前面的代码编译失败,因为它在外部函数中调用类
Foo
的私有和受保护方法。但是,情况并非如此,因为上面的示例在DMD v2.063.2上编译和运行时没有错误或警告。显然,关键词与C++的含义不同。

我的问题是:

1) 如何使一个方法和/或变量对一个类是私有的,这样只有有问题的类才能访问它


2) 如何使方法和/或变量受到保护,以便只有相关类及其派生类才能访问它。

访问修饰符是模块/文件级别的(仅保护异常)

要删除对类的访问,请将其放入自己的mudule中:

食品与药物

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
}

D与C对公共、私人和受保护的术语的含义稍有不同++

Private意味着只有封闭类的成员才能访问该成员,或者访问与封闭类位于同一模块中的成员和函数。不能覆盖私有成员。私有模块成员相当于C程序中的静态声明

包扩展了private,以便可以从同一包中的其他模块中的代码访问包成员。如果模块位于嵌套包中,则这仅适用于最内层的包

受保护意味着只有封闭类的成员或从该类派生的任何类,或与封闭类位于同一模块中的成员和函数,才能访问该成员。如果通过派生类成员函数访问受保护的实例成员,则只能针对可以隐式转换为与“this”相同类型的对象实例访问该成员。受保护的模块成员是非法的

Public表示可执行文件中的任何代码都可以访问该成员。

请参阅
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
}