2014-06-06 7 views
5

저는 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 
} 

내가 그것을 외부 함수에서 클래스 Foo의 개인 보호 메소드를 호출하기 때문에 앞의 코드는 컴파일에 실패 할 것으로 예상됩니다. 그러나 위의 예는 DMD v2.063.2에서 오류나 경고없이 컴파일되고 실행되기 때문에 그렇지 않습니다. 분명히 키워드는 C++과는 다른 의미를 갖습니다.

내 질문은 : 질문 만 클래스가 액세스 할 수 있도록

1) 어떻게 수업 방법 및/또는 변수 개인을 할 수 있습니다.

2) 문제의 클래스와 파생 클래스 만 액세스 할 수 있도록 메소드 및/또는 변수를 보호하는 방법.

+1

참조 http://stackoverflow.com/questions/8393372/where-can-i-read-more-about-ds-class-access-modifiers/8393430#8393430 –

답변

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(); 
    } 
} 

주 .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 
} 
4

D는 공용 개인 및 C++보다 보호

개인은 둘러싼 클래스의 멤버 만이 멤버에 액세스 할 수 있다는 것을 의미합니다. 즉, 둘러싸는 클래스와 동일한 모듈에있는 멤버 및 함수에 액세스 할 수 있습니다. 비공개 멤버를 재정의 할 수 없습니다. 전용 모듈 멤버는 C 프로그램의 정적 선언과 동일합니다.

패키지는 패키지 구성원이 동일한 패키지에있는 다른 모듈의 코드에서 액세스 할 수 있도록 확장됩니다. 모듈이 중첩 된 패키지에있는 경우에만 내부 패키지에만 적용됩니다.

보호는 해당 클래스에서 파생 된 클래스 또는 해당 클래스에서 파생 된 클래스 또는 해당 클래스의 동일한 모듈에있는 멤버와 함수 만 해당 멤버에 액세스 할 수 있음을 의미합니다. 파생 클래스 멤버 함수를 통해 보호 된 인스턴스 멤버에 액세스하는 경우 해당 멤버는 'this'와 동일한 유형으로 암시 적으로 캐스트 될 수있는 객체 인스턴스에 대해서만 액세스 할 수 있습니다. 보호 된 모듈 구성원은 불법입니다.

공개는 실행 파일 내의 모든 코드가 멤버에 액세스 할 수 있음을 의미합니다.

관련 문제