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.
En C ++, solo hay tres modificadores de acceso. C # extiende el número de ellos a seis, mientras que Java tiene cuatro modificadores de acceso, pero tres palabras clave para este propósito. En Java, no tener una palabra clave antes se establece de forma predeterminada en el modificador package-private.
Cuando la clase se declara pública, es accesible para otras clases definidas en el mismo paquete, así como para aquellas definidas en otros paquetes. Este es el especificador de clases más utilizado. Sin embargo, una clase en sí misma no se puede declarar 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 clases fuera del paquete. Cuando decimos que una clase es inaccesible, simplemente significa que no podemos crear un objeto de esa clase o 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 de llamadas public
, protected
y private
. C # tiene los modificadores public
, protected
, internal
, private
, protected internal
, y private protected
. Java tiene public
, package
, protected
, y private
. El modificador de acceso package
es el predeterminado y se usa, si falta alguna otra palabra clave del modificador de acceso. El significado de estos modificadores puede diferir de un idioma a otro. A continuación se muestra una comparación de las palabras clave, ordenadas de la más restrictiva a la más abierta, y su significado en estos tres idiomas. Su visibilidad varía desde la misma clase hasta el paquete donde se define la clase hasta un permiso de acceso general. A continuación, el acceso máximo está escrito en la tabla.
En Swift, hay cinco niveles de acceso diferentes relacionados tanto con el archivo fuente en el que se define la entidad como con el módulo que contiene ese archivo fuente.
Palabra clave | C# | C ++ | Java | Rápido |
---|---|---|---|---|
private | clase | clases de clase y / o amigos | clase | adjuntar declaración solamente + extensiones de declaración en el mismo archivo |
fileprivate | - | - | - | mismo archivo |
private protected | clases derivadas en el mismo ensamblado | - | - | - |
protected internal | mismo ensamblado y / o clases derivadas | - | - | - |
protected | clases derivadas | clases derivadas y / o clases de amigos | clases derivadas y / o dentro del mismo paquete | - |
package | - | - | dentro de su paquete | - |
internal | mismo montaje | - | - | mismo módulo |
public | todos | todos | todos | todos |
open | - | - | - | todos + subclase módulo exterior + anular módulo exterior |
#include lt;iostreamgt; #include lt;conio.hgt; 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 lt;lt; "B::f" lt;lt; 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 lt;lt; d.get_n() lt;lt; endl; // output: 2 // d.f(); // ERROR, B::f is inaccessible as D::f Bamp; 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 lt;lt; b.get_n(); // ERROR, 'struct B' has no member named 'get_n' b.f(); // calls B::f() return 0; }