Modificatori de acces - Access modifiers

Modificatorii de acces (sau specificatorii de acces ) sunt cuvinte cheie în limbaje orientate obiect care stabilesc accesibilitatea claselor, metodelor și a altor membri. Modificatorii de acces sunt o parte specifică a sintaxei limbajului de programare utilizat pentru a facilita încapsularea componentelor.

În C ++ , există doar trei modificatori de acces. C # extinde numărul acestora la șase, în timp ce Java are patru modificatori de acces, dar trei cuvinte cheie în acest scop. În Java, fără a avea un cuvânt cheie înainte, este implicit modificatorul pachet-privat.

Când clasa este declarată publică, este accesibilă pentru alte clase definite în același pachet, precum și pentru cele definite în alte pachete. Acesta este cel mai frecvent utilizat specificator pentru clase. Cu toate acestea, o clasă în sine nu poate fi declarată privată. Dacă nu este specificat niciun specificator de acces, se vor aplica restricțiile implicite de acces. Clasa va fi accesibilă pentru alte clase din același pachet, dar va fi inaccesibilă pentru clasele din afara pachetului. Când spunem că o clasă este inaccesibilă, înseamnă pur și simplu că nu putem crea un obiect din acea clasă sau să declarăm o variabilă de acel tip de clasă. Specificatorul de acces protejat nu poate fi aplicat nici unei clase.

Numele cuvintelor cheie

C ++ foloseste cele trei modificatori numite public , protected și private . C # are modificatorii public , protected , internal , private , protected internal și private protected . Java are public , package , protected și private . Modificatorul de acces package este implicit și este utilizat, dacă lipsește orice alt cuvânt cheie modificator de acces. Semnificația acestor modificatori poate diferi de la o limbă la alta. Urmează o comparație a cuvintelor cheie, ordonate de la cele mai restrictive la cele mai deschise, și semnificația lor în aceste trei limbi. Vizibilitatea lor variază de la aceeași clasă la pachetul în care clasa este definită până la o permisiune generală de acces. Mai jos, accesul maxim este scris în tabel.

În Swift, există cinci niveluri de acces diferite în raport atât cu fișierul sursă în care este definită entitatea, cât și cu modulul care conține fișierul sursă respectiv.

Cuvânt cheie C # C ++ Java Rapid
private clasă cursuri de clasă
și / sau
prieteni
clasă atașând numai declarație
+ extensii ale declarației în același fișier
fileprivate - - - același fișier
private protected clase derivate în același ansamblu - - -
protected internal același ansamblu
și / sau
clase derivate
- - -
protected clase derivate clase derivate
și / sau
clase de prieteni
clase derivate
și / sau
în cadrul aceluiași pachet
-
package - - în cadrul pachetului său -
internal aceeași asamblare - - același modul
public toata lumea toata lumea toata lumea toata lumea
open - - - toată lumea
+ subclasă modul exterior
+ suprascrie modul exterior

Exemplu în 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;
}

Referințe

Note

Bibliografie