D类的公共,私有和受保护的访问限定符

gla*_*ert 5 d class

我是一个以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)如何使方法和/或变量受到保护,以便只有有问题的类及其派生类才能访问它.

rat*_*eak 6

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

删除对类的访问权限将其放入自己的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)