En programación orientada a objetos, el encapsulamiento consiste en poder elegir qué información de un objeto es publicada y cuál forma parte de su estado, no siendo esta última accesible entre objetos.
Esta definición se podría identificar como la definición pura de lo que en POO es el encapsulamiento, sin embargo, en la realidad no siempre es así. Por ejemplo, en java todo el comportamiento es el esperado, en cambio, en C# la cosa cambia.
Por ejemplo, en el siguiente código java, tenemos una clase BaseClass la cual contiene un campo privado y método público a través del cual se puede acceder a dicho campo.
public class BaseClass {
private int _cont = 0;
private ExtendClass bClass = new ExtendClass ();
public int Cont() {
return _cont;
}
public int ParentCont() {
return bClass.Cont();
}
}
En la siguiente clase, heredamos de BaseClass y sobrescribimos el método Cont.
public class ExtendClass extends BaseClass{
public int Cont() {
return 3;
}
}
Dentro del método ParentCont de la BaseClass accedemos a una instancia previamente creada de ExtendClass , y lo hacemos a través de su método público ParentCont, en ningún momento se nos ocurriría acceder al campo privado, ya que rompería con el encapsulamiento.
Sin embargo, en C# no ocurre lo mismo que en Java. Es decir, en C# podríamos acceder al campo privado (bClass._cont), lo cual en mi opinión no me parece correcto. Tampoco entiendo la razón para romper con el paradigma de la programación orientada a objetos de ese modo.