Bienvenidos sean a este post, hoy trataremos sobre un tema muy particular como es la encapsulacion y las posibildades que nos brinda.
La encapsulacion es el proceso que nos permite encerrar uno o mas elementos dentro de un paquete logico o fisico
El Tinchicus
Pero en la programacion orientada a objetos es una metodologia para prevenir el acceso a detalles de la implementacion, una practica relacionada a encapsulacion es la abstraccion ya que este nos permite hacer visible informacion relevante y la encapsulacion define los niveles de abstraccion.
La encapsulacion esta implementada por modificadores de acceso y estos seran los encargados de definir el rango y la visibilidad de los miembros de la clase, veamos los disponibles:
- public
- private
- protected
- internal
- protected internal
El modificador public nos permitira exponer todos los miembros que definamos de esta manera, estos pueden ser tanto metodos (funciones) como propiedades (variables) dentro de las clases y las mismas podran ser accedidas desde afuera de la misma.
El modificador private permite a una clase hacer todo lo contrario a la anterior, es decir que permite denegar el acceso a las propiedades y metodos desde otros objetos o clases, y estos elementos solo pueden ser accedidos por miembros dentro de la misma clase, inclusive una instancia de la misma clase no podria acceder.
El modificador protected es mas utilizado para cuando tenemos clases heredadas, dado que trabaja como public para las clase hijas de la clase base y como private para las clases externas a la misma.
El modificador internal es el predeterminado cuando no informamos ninguno, este nos permite al igual que public exponer todos los metodos y propiedades de la clase dentro del mismo ensamblado (assembly), es decir que todas las clases podran tener acceso siempre y cuando esten dentro del mismo ensamblado.
Nota: mas adelante hablaremos sobre assemblies y referencias.
El modificador protected internal es una mezcla entre el internal y el protected, porque ocultara a los miembros a las clases externas de esta pero si le permitira el acceso a las hijas de la clase base.
Para entender mejor este concepto vamos a analizar el siguiente codigo:
capsula.cs
using System;
class primera
{
internal int valor1;
protected int valor2;
}
class segunda
{
public int valor1;
private int valor2;
}
class tercera : primera
{
private int valor3;
public int valor4;
}
public class Program
{
static int Main()
{
return 0;
}
}
En este caso crearemos tres clases, las tres tendran dos variables almacenadas y en la ultima clase la haremos heredera de la primera, distribuiremos entre las mismas los modificadores de private, public y protected, si los compilamos nos tirara algunos errores pero nada grave porque simplemente nos notificara que no la estamos usando, vamos a modificar el Main de la siguiente manera:
static int Main()
{
primera v1 = new primera();
v1.valor1 = 10;
Console.WriteLine(v1.valor1);
return 0;
}
En este creamos un objeto de la clase primera y a la propiedad valor1 le asignamos un valor y lo mostramos en pantalla, compilemos y probemos:
C:\Users\tinchicus\Documents\Visual Studio 2019>capsula.exe
10
C:\Users\tinchicus\Documents\Visual Studio 2019>
Vamos a modificar el Main agregando las siguientes tres lineas:
segunda v2 = new segunda();
v2.valor2 = 10;
Console.WriteLine(v1.valor1);
En este caso creamos un nuevo objeto de la clase segunda y lo llamamos v2, luego tomaremos a valor2 y le agregaremos un valor para mostrarlo en pantalla, al compilarlo nos dara el siguiente mensaje de error:
capsula.cs(29,6): error CS0122: 'segunda.valor2' no es accesible debido a su
nivel de protección
Como es private no podremos llegar a esta propiedad por ende no nos permite compilarlo, para solucionar esto podemos hacer dos cosas:
- Transformar la variable en public o internal
- Crear dos funciones para manejar la informacion de la variable
Para este caso vamos a tomar la segunda medida pero la vamos a hacer mas dificil todavia:
class segunda
{
public int valor1;
private int valor2;
public segunda(int valor)
{
valor2 = valor;
}
public int getValor2()
{
return valor2;
}
}
Para esta ocasion creamos un nuevo constructor que recibira un valor y lo asignara a valor2, para despues crear una funcion llamada getValor2 de tipo public, la cual se encargara de devolver el dato que tenga asignado valor2, antes de probarlo debemos modificar el bloque de Main de la siguiente manera:
public class Program
{
static int Main()
{
primera v1 = new primera();
v1.valor1 = 10;
Console.WriteLine(v1.valor1);
segunda v2 = new segunda(10);
Console.WriteLine(v2.getValor2());
return 0;
}
}
En este caso cuando creamos al segundo objeto llamamos al nuevo constructor y le enviamos el dato para valor2 y luego lo mostramos en pantalla, con esto modificado podemos compilarlo y ver que salida obtenemos:
C:\Users\tinchicus\Documents\Visual Studio 2019>capsula.exe
10
10
C:\Users\tinchicus\Documents\Visual Studio 2019>
Como pueden ver pudimos mantener a nuestra variable en modo privado, pudimos modificarla y acceder pero por otros medios, en este caso el constructor y un metodo publico para poder recuperar el valor de la variable (getValor2), ahora vamos a modificar el Main agregando las siguientes lineas:
tercera v3 = new tercera();
v3.valor2 = 10;
v3.valor4 = 20;
Console.WriteLine(v3.valor2 + v3.valor4);
En este bloque creamos un nuevo objeto de la clase tercera llamado v3, como este es un heredero de la clase primera le dijimos que asigne un valor a la variable valor2 y valor4 de dicho objeto, para luego mostrar la sumatoria de ambos, si lo compilamos nos dara este mensaje:
capsula.cs(51,6): error CS0122: 'primera.valor2' no es accesible debido a su
nivel de protección
En este caso nos informa que valor2 no es accesible, esto es debido a que esta con protected, y como dijimos dentro de la clase hija o heredera podra tener acceso como publica pero con las instancias no sucedera lo mismo sino que sera un private, para este caso particular vamos a agregar estos dos metodos en la clase tercera:
public void setValor(int valor)
{
valor2 = valor;
}
public int getValor()
{
return valor2;
}
El primer metodo llamado setValor recibira un valor y luego lo asignara a valor2, en el siguiente metodo hacemos una devolucion de valor2, ambas funciones deben ser public para que podamos acceder desde el objeto, nuestra siguiente modificacion sera en el Main donde modificaremos las lineas anteriores por las siguientes:
tercera v3 = new tercera();
v3.setValor(10);
v3.valor4 = 20;
Console.WriteLine(v3.getValor() + v3.valor4);
En este bloque ahora creamos el objeto luego le asignamos un valor a valor2 por medio del metodo setValor, y en la siguiente linea a valor4 le asignamos un valor, para luego mostrar la suma de valor2 y valor4 pero para recuperar el valor que posee valor2 usamos a getValor, si lo compilamos y probamos obtendremos la siguiente salida:
C:\Users\tinchicus\Documents\Visual Studio 2019>capsula.exe
10
10
30
C:\Users\tinchicus\Documents\Visual Studio 2019>
Como se observa ahora funciono de manera perfecta, con esto pudimos ver como nos limita los distintos modificadores de acceso permitiendo diferentes niveles de encapsulamiento, esto nos permitira tener distintos niveles de acceso, los mas utilizados son public, private y protected, pero sobre todo pudimos apreciar las diferencias entre los tres y como por medio de una forma indirecta pudimos acceder a un elemento privado.
En resumen, hoy hemos visto la encapsulacion, como es, para que nos puede servir, las distintas formas de poder hacerlas, los distintos modificadores de acceso a nuestra disposicion, cuales son sus caracteristicas, como nos permiten o prohiben el acceso a los metodos y propiedades de una clase, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.
Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar
Es para mantenimiento del sitio, gracias!
1.00 $