Los modificadores de acceso (o especificadores de acceso ) son palabras clave en lenguajes orientados a objetos que establecen la accesibilidad de clases , métodos y otros miembros. Los modificadores de acceso son una parte específica de la sintaxis del lenguaje de programación que se utiliza para facilitar la encapsulación de componentes. [1]
En C++ , solo hay tres modificadores de acceso. C# amplía el número de ellos a seis, [2] mientras que Java tiene cuatro modificadores de acceso, pero tres palabras clave para este propósito. En Java, si no hay ninguna palabra clave antes, se usa el modificador package-private de manera predeterminada.
Cuando la clase se declara como pública, es accesible para otras clases definidas en el mismo paquete, así como para aquellas definidas en otros paquetes. Este es el especificador más comúnmente utilizado para las clases. Sin embargo, una clase en sí no puede declararse como privada. Si no se indica ningún especificador de acceso, se aplicarán las restricciones de acceso predeterminadas. La clase será accesible para otras clases en el mismo paquete, pero será inaccesible para las clases fuera del paquete. Cuando decimos que una clase es inaccesible, simplemente significa que no podemos crear un objeto de esa clase ni declarar una variable de ese tipo de clase. El especificador de acceso protegido tampoco se puede aplicar a una clase.
C++ utiliza los tres modificadores llamados public
, protected
, y private
. [3] C# tiene los modificadores public
, protected
, internal
, private
, protected internal
, private protected
y file
. [4] Java tiene public
, package
, protected
y private
; package
es el valor predeterminado, utilizado si no se especifica ninguna otra palabra clave modificadora de acceso. El significado de estos modificadores puede diferir de un lenguaje a otro. A continuación, se muestra una comparación de las palabras clave, ordenadas desde la más restrictiva a la más abierta, y su significado en estos tres lenguajes. Su visibilidad varía desde la misma clase hasta el paquete donde se define la clase y un permiso de acceso general. A continuación, se escribe el acceso máximo en la tabla.
En Swift, hay cinco niveles de acceso diferentes en relación con el archivo fuente en el que se define la entidad y el módulo que contiene ese archivo fuente. [5]
#include <iostream> #include <conio.h> usando std :: cout ; usando std :: endl ; struct B { // el modificador de acceso predeterminado dentro de struct es público void set_n ( int v ) { n = v ; } void f () { cout << "B::f" << endl ; } protected : int m , n ; // B::m, B::n están protegidos private : int x ; }; struct D : B { using B :: m ; // D::m es público int get_n () { return n ; } // B::n es accesible aquí, pero no afuera // int get_x() { return x; } // ERROR, B::x es inaccesible aquí private : using B :: f ; // D::f es privado }; int main () { D d ; // dx = 2; // ERROR, privado // dn = 2; // ERROR, protegido d . m = 2 ; // protegido B::m es accesible como D::m d . set_n ( 2 ); // llama a B::set_n(int) cout << d . get_n () << endl ; // salida: 2 // df(); // ERROR, B::f es inaccesible como D::f B & b = d ; // b hace referencia a d y lo "ve" como de tipo B // bx = 3; // ERROR, privado // bn = 3; // ERROR, protegido // bm = 3; // ERROR, B::m está protegido b . set_n ( 3 ); // llama a B::set_n(int) // cout << b.get_n(); // ERROR, 'struct B' no tiene ningún miembro llamado 'get_n' b . f (); // llama a B::f() y devuelve 0 ; }