Tilgangsmodifikatorer - Access modifiers

Tilgangsmodifikatorer (eller tilgangsspesifikatorer ) er nøkkelord objektorienterte språk som angir tilgjengeligheten til klasser, metoder og andre medlemmer. Tilgangsmodifikatorer er en spesifikk del av programmeringsspråksyntaks som brukes for å lette innkapsling av komponenter.

I C ++ er det bare tre tilgangsmodifikatorer. C # utvider antallet av dem til seks, mens Java har fire tilgangsmodifikatorer, men tre nøkkelord for dette formålet. I Java, som ikke har noe nøkkelord før, er standard pakken-privat modifikator.

Når klassen er erklært offentlig, er den tilgjengelig for andre klasser som er definert i samme pakke, så vel som de som er definert i andre pakker. Dette er den mest brukte spesifikatoren for klasser. Imidlertid kan en klasse i seg selv ikke erklæres som privat. Hvis ingen tilgangsspesifikatorer er oppgitt, vil standard tilgangsbegrensninger bli brukt. Klassen vil være tilgjengelig for andre klasser i samme pakke, men vil være utilgjengelig for klasser utenfor pakken. Når vi sier at en klasse er utilgjengelig, betyr det ganske enkelt at vi ikke kan lage et objekt av den klassen eller erklære en variabel av den klassetypen. Spesifikatoren for beskyttet tilgang kan ikke brukes på en klasse.

Navn på nøkkelord

C ++ bruker de tre modifikatorer kalt public , protected og private . C # har modifikatorer public , protected , internal , private , protected internal , og private protected . Java har public , package , protected , og private . Tilgangsmodifisereren package er standard og brukes, hvis det mangler et annet nøkkelord for tilgangsmodifikator. Betydningen av disse modifikatorene kan variere fra språk til språk. En sammenligning av nøkkelordene, bestilt fra de mest restriktive til de mest åpne, og deres betydning på disse tre språkene følger. Deres synlighet varierer fra samme klasse til pakken der klassen er definert til en generell tilgangstillatelse. Nedenfor er maksimal tilgang skrevet inn i tabellen.

I Swift er det fem forskjellige tilgangsnivåer i forhold til både kildefilen der enheten er definert og modulen som inneholder den kildefilen.

Nøkkelord C # C ++ Java Fort
private klasse klasse
og / eller
venneklasser
klasse kun
vedlegg + erklæringutvidelser i samme fil
fileprivate - - - samme fil
private protected avledede klasser i samme forsamling - - -
protected internal samme montering
og / eller
avledede klasser
- - -
protected avledede klasser avledede klasser
og / eller
venneklasser
avledede klasser
og / eller
innenfor samme pakke
-
package - - innenfor pakken -
internal samme montering - - samme modul
public alle alle alle alle
open - - - alle
+ underklasse utenfor modul
+ overstyre utenfor modul

Eksempel i 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;
}

Referanser

Merknader

Bibliografi