2014-06-06 18 views
5

Ich bin ein C++ - Programmierer, der mit D beginnt, und ich habe Probleme, die Zugriffsqualifizierer für D-Klassen zu verstehen. Betrachten Sie das folgende Beispiel:Öffentliche, private und geschützte Zugriffsqualifizierer für D-Klassen

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 
} 

Ich würde der vorherige Code erwartet Kompilation zum Scheitern verurteilt, da es private und geschützten Methoden der Klasse ruft Foo in einer externen Funktion. Dies ist jedoch nicht der Fall, da das obige Beispiel kompiliert und ohne Fehler oder Warnungen auf DMD v2.063.2 ausgeführt wird. Offensichtlich haben die Schlüsselwörter eine andere Bedeutung als C++.

Meine Fragen sind:

1) Wie ein Verfahren und/oder variable privat zu einer Klasse machen, so dass nur die betreffenden Klasse darauf zugreifen kann.

2) Wie man eine Methode und/oder eine Variable schützt, so dass nur die betreffende Klasse und ihre abgeleiteten Klassen darauf zugreifen können.

+1

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

Antwort

6

die Zugriffsmodifikatoren sind Modul/Dateiebene (einzige Ausnahme geschützt ist)

Zugang zu einer Klasse in einem eigenen Mudule setzen, es zu entfernen:

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

Haupt .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 hat eine etwas andere Bedeutung als die Begriffe public private und Geschützt als C++

Private bedeutet, dass nur Mitglieder der einschließenden Klasse auf das Mitglied oder Mitglieder und Funktionen im selben Modul wie die einschließende Klasse zugreifen können. Private Mitglieder können nicht überschrieben werden. Private Modulmitglieder entsprechen statischen Deklarationen in C-Programmen.

Das Paket dehnt sich privat aus, so dass auf Paketelemente über Code in anderen Modulen zugegriffen werden kann, die sich im selben Paket befinden. Dies gilt nur für das innerste Paket, wenn sich ein Modul in verschachtelten Paketen befindet.

Geschützt bedeutet, dass nur Member der einschließenden Klasse oder von dieser Klasse abgeleitete Klassen oder Member und Funktionen im selben Modul wie die umschließende Klasse auf das Member zugreifen können. Wenn auf ein geschütztes Instanzelement über eine abgeleitete Klassenmemberfunktion zugegriffen wird, kann auf dieses Member nur für die Objektinstanz zugegriffen werden, die implizit in denselben Typ wie 'this' umgewandelt werden kann. Geschützte Modulmitglieder sind illegal.

Öffentlich bedeutet, dass jeder Code innerhalb der ausführbaren Datei auf das Mitglied zugreifen kann.

Verwandte Themen