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 # extiende 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, al no tener una palabra clave antes, se usa de forma predeterminada el modificador package-private.
Cuando la clase se declara pública, es accesible para otras clases definidas en el mismo paquete, así como las definidas en otros paquetes. Este es el especificador de clases más utilizado. Sin embargo, una clase en sí misma 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 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.
Nombres de palabras clave
C ++ utiliza los tres modificadores de llamadas public
, protected
y private
. [3] 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. [4]
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 |
Ejemplo en C ++
#include #include usando std :: cout ; usando std :: endl ;struct B { // el modificador de acceso predeterminado dentro de la estructura es public void set_n ( int v ) { n = v ; } void f () { cout << "B :: f" << endl ; } protegido : int m , n ; // B :: m, B :: n están protegidos private : int x ; }; estructura D : B { usando B :: m ; // D :: m es public int get_n () { return n ; } // B :: n es accesible aquí, pero no fuera // 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 () return 0 ; }
Referencias
Notas
- ^ Mayo de 2002 , págs.199.
- ^ Wagner, Bill . "Modificadores de acceso - Guía de programación de C #" . docs.microsoft.com . Consultado el 13 de enero de 2020 .
- ^ "Especificadores de acceso" . en.cppreference.com . Consultado el 13 de enero de 2020 .
- ^ "Control de acceso - El lenguaje de programación Swift (Swift 5.3)" . docs.swift.org . Consultado el 8 de febrero de 2021 .
Bibliografía
- Mayo, Joseph (2002), C Sharp Unleashed , Sams publishing, ISBN 9780672321221