Programmazione D - Modificatori di accesso alla classe

L'occultamento dei dati è una delle caratteristiche importanti della programmazione orientata agli oggetti che consente di impedire alle funzioni di un programma di accedere direttamente alla rappresentazione interna di un tipo di classe. La restrizione di accesso ai membri della classe è specificata dall'etichettapublic, private, e protectedsezioni all'interno del corpo della classe. Le parole chiave public, private e protected sono chiamate specificatori di accesso.

Una classe può avere più sezioni con etichetta pubblica, protetta o privata. Ogni sezione rimane attiva fino a quando non viene visualizzata un'altra etichetta di sezione o la parentesi graffa destra di chiusura del corpo della classe. L'accesso predefinito per membri e classi è privato.

class Base { 
  
   public: 
  
  // public members go here 
  
   protected: 
  
  // protected members go here 
  
   private: 
  
  // private members go here 
  
};

I membri pubblici in D

UN publicmembro è accessibile da qualsiasi luogo all'esterno della classe ma all'interno di un programma. È possibile impostare e ottenere il valore delle variabili pubbliche senza alcuna funzione membro come mostrato nell'esempio seguente:

Esempio

import std.stdio;

class Line { 
   public:
      double length; 

      double getLength() { 
         return length ; 
      }
      
      void setLength( double len ) { 
         length = len; 
      } 
} 
 
void main( ) { 
   Line line = new Line();
   
   // set line length 
   line.setLength(6.0); 
   writeln("Length of line : ", line.getLength());  
   
   // set line length without member function 
   line.length = 10.0; // OK: because length is public 
   writeln("Length of line : ", line.length); 
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Length of line : 6 
Length of line : 10

I membri privati

UN privatenon è possibile accedere alla variabile membro o alla funzione, o anche visualizzarla dall'esterno della classe. Solo le funzioni di classe e di amicizia possono accedere ai membri privati.

Per impostazione predefinita, tutti i membri di una classe sono privati. Ad esempio nella seguente classewidth è un membro privato, il che significa che fino a quando non etichetti esplicitamente un membro, si presume come un membro privato -

class Box { 
   double width; 
   public: 
      double length; 
      void setWidth( double wid ); 
      double getWidth( void ); 
}

In pratica, è necessario definire i dati nella sezione privata e le relative funzioni nella sezione pubblica in modo che possano essere richiamati dall'esterno della classe come mostrato nel programma seguente.

import std.stdio;

class Box { 
   public: 
      double length; 

      // Member functions definitions
      double getWidth() { 
         return width ; 
      } 
      void setWidth( double wid ) { 
         width = wid; 
      }

   private: 
      double width; 
}
  
// Main function for the program 
void main( ) { 
   Box box = new Box();
   
   box.length = 10.0; 
   writeln("Length of box : ", box.length);
   
   box.setWidth(10.0);  
   writeln("Width of box : ", box.getWidth()); 
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Length of box : 10 
Width of box : 10

I membri protetti

UN protected La variabile o la funzione membro è molto simile a un membro privato, ma fornisce un ulteriore vantaggio che è possibile accedervi nelle classi figlie chiamate classi derivate.

Imparerai le classi derivate e l'ereditarietà nel prossimo capitolo. Per ora puoi controllare il seguente esempio in cui una classe figlioSmallBox è derivato da una classe genitore Box.

L'esempio seguente è simile all'esempio precedente e qui width è accessibile da qualsiasi funzione membro della sua classe derivata SmallBox.

import std.stdio;

class Box { 
   protected: 
      double width; 
} 
 
class SmallBox:Box  { // SmallBox is the derived class. 
   public: 
      double getSmallWidth() { 
         return width ; 
      }
	  
      void setSmallWidth( double wid ) {
         width = wid; 
      } 
} 
 
void main( ) { 
   SmallBox box = new SmallBox();  
   
   // set box width using member function 
   box.setSmallWidth(5.0); 
   writeln("Width of box : ", box.getSmallWidth()); 
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Width of box : 5