Anuncios

Bienvenidos sean a este post, hoy trataremos sobre un tema muy particular como es la encapsulacion y las posibildades que nos brinda.

Anuncios

La encapsulacion es el proceso que nos permite encerrar uno o mas elementos dentro de un paquete logico o fisico

El Tinchicus
Anuncios

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.

Anuncios

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
Anuncios

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.

Anuncios

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.

Anuncios

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.

Anuncios

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.
Anuncios

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.

Anuncios

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;
	}
}
Anuncios

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;
	}
Anuncios

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>
Anuncios

Vamos a modificar el Main agregando las siguientes tres lineas:

		segunda v2 = new segunda();
		v2.valor2 = 10;
		Console.WriteLine(v1.valor1);
Anuncios

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
Anuncios

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
Anuncios

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;
	}
}
Anuncios

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;
	}
}
Anuncios

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>
Anuncios

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);
Anuncios

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
Anuncios

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;
	}
Anuncios

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);
Anuncios

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>
Anuncios

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.

Anuncios

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.

Anuncios

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 $