Thursday, February 08, 2007

protected, internal, protected internal... de verdad sabes que hacen?

Este articulo aplica a C#
Todos creemos dominar los modificadores de acceso, pero me puedes decir lo que protected internal hace?
apuesto que mas de la mitad de los desarrolladores .NET contestarian incorrectamente, vamos a ver:

  1. private:
    1. Este es el nivel de acceso mas restrictivo.
    2. Es accesible solamente dentro del cuerpo de la clase o estructura en que esta declarado.
    3. Tipos declarados dentro (nested types) del mismo cuerpo de la clase tambien tienen acceso a los tipos privados.
  2. public:
    1. Este es el nivel de acceso con menos restricciones.
    2. No hay restricciones para accesar miembros publicos, son tan visibles como la clase.
  3. protected:
    1. El acceso es limitado a la clase que los contiene o a tipos derivados de la clase.
    2. Lo cual quiere decir que no puedes crear una instancia de esta clase y accesar los miembros protegidos.
  4. internal:
    1. El acceso esta limitado solo al assembly en donde la clase reside.
  5. protected internal:
    1. Acceso es limitado a el assembly donde la clase reside o a tipos derivados de la clase.

Este ultimo es bastante capcioso, a primera vista podria parecer que permite acceso solo dentro del assembly donde la clase reside y las clases derivadas, pero el "o" ahi es lo que hace la diferencia, si marcas una propiedad protected internal puede ser usada fuera del assembly actual. basicamente protected sobreescribe internal, asi que ni siquiera estoy seguro de cuando es que se podria usar tal modificador.

pero bueno, regresando al tema, si no me crees eso de protected internal, puedes verificar tu mismo:

Assembly1:

public class Test {
protected internal string prop1;
}


Assembly2://despues de agregar la referencia a Assembly 1

public class Test2: Test {
public string prop2;
public Test2() {
prop2 = prop1; //el acceso a prop1 viene de otro assembly, de un miembro protected internal
}
}


Si esto es nuevo para ti, podrias pensar que es absurdo, entonces como haces que una propiedad sea visible solo en el assembly actual y en las clases derivadas (pero solo de este assembly)?

Pues no es tan complicado, marcas la clase como internal, lo cual restringe el acceso solo al assembly actual, y luego marcas la propiedad como protected, lo cual resulta en acceso desde las clases derivadas pero solo dentro del assembly actual.:

internal class Test {
//accesible solo en este assembly y clases derivadas dentro de este assembly
protected string prop1;
}

salu2

No comments: