InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial C#
Introduccion a C#
Programacion con C#
Fundamentos de C#
Operadores
Instrucciones
Estrcuturas de control.
Definición de clases
Creación de objetos
Herencia y métodos virtuales
Polimorfismo
Ocultación de miembros
Miembros de tipo
Encapsulación
Espacios de nombres
Importación de espacios de nombres
Espacio de nombres distribuidos
Variables y tipos de datos
Tablas unidimensionales
Tablas multidimensionales
La clase System.Array
Cadenas de texto
Constantes
Orden de inicialización de variables
Métodos
Métodos externos
Constructores
Destructores
Propiedades
Indizadores
Redefinición de operadores
Delegados y eventos
La clase MulticastDelegate
Llamadas asíncronas
Implementación interna de los delegados
Eventos
Estructuras
Boxing y unboxing
Constructores de estructuras
Enumeraciones
Interfaces
Excepciones
Otras instrucciones
Atributos
Definición de nuevos atributos
Lectura de atributos en tiempo de ejecución
Atributos de compilación
Pseudoatributos
Código inseguro
Definición de punteros
Manipulación de punteros
Operadores relacionados con código inseguro
Fijación de variables apuntadas
Novedades de C# 2.0
Genéricos
Tipos parciales
Iteradores
Mejoras en la manipulación de delegados
Tipos anulables
Modificadores de visibilidad de bloques get y set
Clases estáticas
Referencias a espacios de nombres
Supresión temporal de avisos
Atributos condicionales
Incrustación de tablas en estructuras
Modificaciones en el compilador
También puedes ver ...
Serialización: XmlSerializer y BinaryFormater
Handler para manipular imagenes
Conversiones de tipos personalizadas (VB y C#)
Compresión por gzip y deflate
La página Web que está abriendo contiene tanto elementos seguros como no seguros.
Cómo insertar un fichero .xml en un campo de tipo XML de SQL server 2005 o 2008
Comparativa de sentencias VB.Net vs C#
Aprende Ajax desde cero
Creando cadenas de conexión ConnectionStrings en .net 3.5 o visual Studio 2008 usando SqlConnectionStringBuilder
Migración de WSE a WCF (Web Services de 2005 a 2008)

Afiliados
La Web del programador
MundoProgramacion


Encapsulación

    Ya hemos visto que la herencia y el polimorfismo eran dos de los pilares fundamentales en los que es apoya la programación orientada a objetos. Pues bien, el tercero y último es la encapsulación, que es un mecanismo que permite a los diseñadores de tipos de datos determinar qué miembros de los tipos creen pueden ser utilizados por otros programadores y cuáles no. Las principales ventajas que ello aporta son:

  • Se facilita a los programadores que vaya a usar el tipo de dato (programadores clientes) el aprendizaje de cómo trabajar con él, pues se le pueden ocultar todos los detalles relativos a su implementación interna y sólo dejarle visibles aquellos que puedan usar con seguridad. Además, así se les evita que cometan errores por manipular inadecuadamente miembros que no deberían tocar.
  • Se facilita al creador del tipo la posterior modificación del mismo, pues si los programadores clientes no pueden acceder a los miembros no visibles, sus aplicaciones no se verán afectadas si éstos cambian o se eliminan. Gracias a esto es posible crear inicialmente tipos de datos con un diseño sencillo aunque poco eficiente, y si posteriormente es necesario modificarlos para aumentar su eficiencia, ello puede hacerse sin afectar al código escrito en base a la no mejorada de tipo.

    La encapsulación se consigue añadiendo modificadores de acceso en las definiciones de miembros y tipos de datos. Estos modificadores son partículas que se les colocan delante para indicar desde qué códigos puede accederse a ellos, entendiéndose por acceder el hecho de usar su nombre para cualquier cosa que no sea definirlo, como llamarlo si es una función, leer o escribir su valor si es un campo, crear objetos o heredar de él si es una clase, etc.

    Por defecto se considera que los miembros de un tipo de dato sólo son accesibles desde código situado dentro de la definición del mismo, aunque esto puede cambiarse precediéndolos de uno los siguientes modificadores (aunque algunos de ellos ya se han explicado a lo largo del tema, aquí se recogen todos de manera detallada) al definirlos:

  • public: Puede ser accedido desde cualquier código.
  • protected: Desde una clase sólo puede accederse a miembros protected de objetos de esa misma clase o de subclases suyas. Así, en el siguiente código las instrucciones comentadas con // Error no son válidas por lo escrito junto a ellas:


  public class A
  {
   protected int x;
   static void F(A a, B b, C c)
   {
     a.x = 1;  // Ok
     b.x = 1;  // Ok
     c.x = 1;  // OK
   }
  }
 
  public class B: A
  {
   static void F(A a, B b, C c)
   {
   //a.x = 1;  // Error, ha de accederse a traves de objetos tipo B o C
     b.x = 1;  // Ok
     c.x = 1;  // Ok
   }
  }
 
  public class C: B
  {
   static void F(A a, B b, C c)
   {
   //a.x = 1; // Error, ha de accederse a traves de objetos tipo C
   //b.x = 1; // Error, ha de accederse a traves de objetos tipo C

     c.x = 1; // Ok
   }
  }

Obviamente siempre que se herede de una clase se tendrá total acceso en la clase hija –e implícitamente sin necesidad de usar la sintaxis <objeto>.<miembro>- a los miembros que ésta herede de su clase padre, como muestra el siguiente ejemplo:


using System;
class A
{
 protected int x=5;
}
class B:A
{
 B()
 {
  Console.WriteLine("Heredado x={0} de clase A", x);
 }
 
 public static void Main()
 {
  new B();
 }
}

Como es de esperar, la salida por pantalla del programa de ejemplo será:


Heredado x=5 de clase A

           

A lo que no se podrá acceder desde una clase hija es a los miembros protegidos de otros objetos de su clase padre, sino sólo a los heredados. Es decir:


using System;
class A
{
 protected int x=5;
}
class B:A
{
 B(A objeto)
 {
  Console.WriteLine("Heredado x={0} de clase A", x);
  Console.WriteLine(objeto.x); // Error, no es el x heredado
 }
 
 public static void Main()
 {
  new B(new A());
 }
}

  • private: Sólo puede ser accedido desde el código de la clase a la que pertenece.     Es lo considerado por defecto.
  • internal: Sólo puede ser accedido desde código perteneciente al ensamblado en que se ha definido.
  • protected internal: Sólo puede ser accedido desde código perteneciente al ensamblado en que se ha definido o          desde clases que deriven de la clase donde se ha definido.

    Si se duda sobre el modificador de visibilidad a poner a un miembro, es mejor ponerle inicialmente el que proporcione menos permisos de accesos, ya que si luego detecta que necesita darle más permisos siempre podrá cambiárselo por otro menos restringido. Sin embargo, si se le da uno más permisivo de lo necesario y luego se necesita cambiar por otro menos permisivo, los códigos que escrito en base a la versión más permisiva que dependiesen de dicho miembro podrían dejar de funcionar por quedarse sin acceso a él.

    Es importante recordar que toda redefinición de un método virtual o abstracto ha de realizarse manteniendo los mismos modificadores que tuviese el método original. Es decir, no podemos redefinir un método protegido cambiando su accesibilidad por pública, pues si el creador de la clase base lo definió así por algo sería.

    Respecto a los tipos de datos, por defecto se considera que son accesibles sólo desde el mismo ensamblado en que ha sido definidos, aunque también es posible modificar esta consideración anteponiendo uno de los siguientes modificadores a su definición:

  • public: Es posible acceder a la clase desde cualquier ensamblado.
  • internal: Sólo es posible acceder a la clase desde el ensamblado donde se declaró. Es lo considerado por defecto.

    También pueden definirse tipos dentro de otros (tipos internos) En ese caso serán considerados miembros del tipo contenedor dentro de la que se hayan definido, por lo que les serán aplicables todos los modificadores válidos para miembros y por defecto se considerará que, como con cualquier miembro, son privados. Para acceder a estos tipos desde código externo a su tipo contenedor (ya sea para heredar de ellos, crear objetos suyos o acceder a sus miembros estáticos), además de necesitarse los permisos de acceso necesarios según el modificador de accesibilidad al definirlos, hay que usar la notación <nombreTipoContendor>.<nombreTipoInterno>, como muestra en este ejemplo:


// No lleva modificador, luego se considera que es internal
class A
{
//  Si ahora no se pusiese public se consideraría private
 public class AInterna {} 
}
//  B deriva de la clase interna AInterna definida dentro de A. 
//  Es válido porque A.AInterna es pública

class B:A.AInterna     
{}

    Nótese que dado que los tipos externos están definidos dentro de su tipo externo, desde ellos es posible acceder a los miembros estáticos privados de éste. Sin embargo, hay que señalar que no pueden acceder a los miembros no estáticos de su tipo contenedor.


Inicio | Tutorial C# Miembros de tipoTutorial C#Espacios de nombres Versión para imprimir Foros de consulta

 
uso del manual por karlos
Respuesta recibida el [15/12/2007 12:21:34]
Oye, esta muy padre tu manual, pero no hay forma de que lo pongas en pdf u otra versión con la cuál pueda ser descargado y usarse aun sin tener internet, o imprimirla para leerla, ya que algunos no tenemos acceso constante a internet, gracias


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial C# Miembros de tipoTutorial C#Espacios de nombres Versión para imprimir

Encapsulación
Autor: José Antonio González Seco
Visitas: 12527 Fecha de publicación: 04/10/2006
José Antonio es experto en tecnologias Microsoft. Imparte cursos y conferencias en congresos sobre C# y .NET en Universidades de toda España (Sevilla, Barcelona, San Sebastián, Valencia, Oviedo, etc.) en representación de grandes empresas como Microsoft.




Visitas: 201 | Comentarios: 0 | Archivo: Articulos
Categorias: C#
Visitas: 312 | Comentarios: 1 | Archivo: Articulos
Visitas: 386 | Comentarios: 1 | Archivo: Articulos
Categorias: Humor
Visitas: 612 | Comentarios: 3 | Archivo: Articulos
Categorias: C#|ASP.NET
Visitas: 1176 | Comentarios: 4 | Archivo: Articulos
Visitas: 696 | Comentarios: 1 | Archivo: Articulos
Categorias: ASP.NET|ASP|Windows XP|Windows 2003
Visitas: 826 | Comentarios: 2 | Archivo: Articulos
Categorias: Java|Solaris
Visitas: 582 | Comentarios: 0 | Archivo: Articulos
Visitas: 1482 | Comentarios: 1 | Archivo: Articulos
Categorias: ADO.NET
Visitas: 1530 | Comentarios: 3 | Archivo: Articulos
Categorias: ASP.NET

Útimos temas recibidos en los foros ...
Manual Visual Studio.NET por Shiko ... [Visual Basic .NET] 34 26/10/2006
llamar procedimientos de pl/sql en java por jhon ... [ORACLE] 0 03/07/2009
consulta multitablas por anga ... [mySQL] 0 03/07/2009
objetos helper php bajo oracle por objetos_helper_oracle ... [ISAPI] 0 02/07/2009
ranuras isa o pci por sara ... [Access] 5 30/03/2006
descargar tutorial C# por afmp ... [C#] 54 14/10/2008
Tutorial TOAD para Oracle en Español por ijpj ... [ORACLE] 19 14/03/2009
quiero mi numero de mi autogenerado por pablo ... [Visual Basic .NET] 1 15/06/2009
Ayuda con cargar fotografias de otra pc por Alex ... [ASP.NET] 0 01/07/2009
splash screen por zelca ... [Visual Basic .NET] 0 01/07/2009
Error de inicio de aplicación por Danrre ... [C#] 0 30/06/2009
sumar los precios de la columna "precio" del grig por jardinderosas ... [C#] 7 01/11/2007

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
27/02/2007 ¿Permite Windows Vista reproducir peliculas descargadas o "Piratas"? SI, si lo permite
18/10/2005 Enviar emails a través de un servidor SMTP autenticado con Java
24/05/2006 Cursores Explicitos en PL/SQL    forma parte de...Tutorial PL/SQL
22/10/2005 Actualización de datos. UPDATE    forma parte de...Tutorial SQL
11/07/2007 Aplicando formato de fecha y número a una variable.
02/09/2007 Procedimientos almacenados en Transact SQL    forma parte de...Tutorial de Transact SQL
01/05/2007 Como colocar el menú arriba de la ventana en IE7
29/05/2006 J2EE Y .NET: LA RIVALIDAD PERMANENTE
03/10/2006 Definición de clases    forma parte de...Tutorial C#
03/10/2006 Ocultación de miembros    forma parte de...Tutorial C#

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]