Modyfikatory dostępu - Access modifiers

Modyfikatory dostępu (lub specyfikatory dostępu ) to słowa kluczowe w językach obiektowych, które ustawiają dostępność klas, metod i innych elementów członkowskich. Modyfikatory dostępu są specyficzną częścią składni języka programowania używaną w celu ułatwienia hermetyzacji komponentów.

W C ++ są tylko trzy modyfikatory dostępu. C # rozszerza ich liczbę do sześciu, podczas gdy Java ma cztery modyfikatory dostępu, ale trzy słowa kluczowe do tego celu. W Javie brak słowa kluczowego przed ustawieniem domyślnym modyfikatora prywatnego pakietu.

Gdy klasa jest zadeklarowana jako publiczna, jest dostępna dla innych klas zdefiniowanych w tym samym pakiecie, jak również dla tych zdefiniowanych w innych pakietach. Jest to najczęściej używany specyfikator dla klas. Jednak sama klasa nie może zostać zadeklarowana jako prywatna. Jeśli nie zostanie określony żaden specyfikator dostępu, zostaną zastosowane domyślne ograniczenia dostępu. Klasa będzie dostępna dla innych klas w tym samym pakiecie, ale będzie niedostępna dla klas spoza pakietu. Kiedy mówimy, że klasa jest niedostępna, oznacza to po prostu, że nie możemy utworzyć obiektu tej klasy ani zadeklarować zmiennej tego typu. Specyfikatora dostępu chronionego również nie można zastosować do klasy.

Nazwy słów kluczowych

C ++ wykorzystuje trzy modyfikatory zwane public , protected i private . C # ma modyfikatory public , protected , internal , private , protected internal , i private protected . Java ma public , package , protected , i private . Modyfikator dostępu package jest domyślny i używany, jeśli brakuje jakiegokolwiek innego słowa kluczowego modyfikatora dostępu. Znaczenie tych modyfikatorów może się różnić w zależności od języka. Poniżej znajduje się porównanie słów kluczowych, uporządkowanych od najbardziej restrykcyjnych do najbardziej otwartych, i ich znaczenie w tych trzech językach. Ich widoczność waha się od tej samej klasy do pakietu, w którym klasa jest zdefiniowana, do ogólnego uprawnienia dostępu. Poniżej maksymalny dostęp jest zapisany w tabeli.

W Swift istnieje pięć różnych poziomów dostępu w odniesieniu zarówno do pliku źródłowego, w którym jednostka jest zdefiniowana, jak i do modułu zawierającego ten plik źródłowy.

Słowo kluczowe DO# C ++ Jawa Szybki
private klasa klasy
i / lub
zajęcia z przyjaciółmi
klasa załączanie tylko deklaracji
+ rozszerzenia deklaracji w tym samym pliku
fileprivate - - - ten sam plik
private protected klasy pochodne w tym samym zestawie - - -
protected internal ten sam zestaw
i / lub
klasy pochodne
- - -
protected klasy pochodne klasy pochodne
i / lub
klasy zaprzyjaźnione
klasy pochodne
i / lub
w ramach tego samego pakietu
-
package - - w swoim pakiecie -
internal ten sam montaż - - ten sam moduł
public wszyscy wszyscy wszyscy wszyscy
open - - - wszyscy
+ podklasa poza modułem
+ nadpisanie poza modułem

Przykład w C ++

#include <iostream>
#include <conio.h>
using std::cout;
using std::endl;

struct B { // default access modifier inside struct is public
    void set_n(int v) { n = v; }
    void f()          { cout << "B::f" << endl; }
  protected:
    int m, n; // B::m, B::n are protected
  private:
    int x;
};
 
struct D : B {
    using B::m;               // D::m is public
    int get_n() { return n; } // B::n is accessible here, but not outside
//  int get_x() { return x; } // ERROR, B::x is inaccessible here
 private:
    using B::f;               // D::f is private
};
 
int main() {
    D d;

//  d.x = 2; // ERROR, private
//  d.n = 2; // ERROR, protected
    d.m = 2; // protected B::m is accessible as D::m

    d.set_n(2); // calls B::set_n(int)
    cout << d.get_n() << endl; // output: 2

//  d.f();   // ERROR, B::f is inaccessible as D::f


    B& b = d; // b references d and "views" it as being type B

//  b.x = 3; // ERROR, private
//  b.n = 3; // ERROR, protected
//  b.m = 3; // ERROR, B::m is protected

    b.set_n(3); // calls B::set_n(int)
//  cout << b.get_n(); // ERROR, 'struct B' has no member named 'get_n'

    b.f();   // calls B::f()
    return 0;
}

Bibliografia

Uwagi

Bibliografia