El Blog de Óscar Sotorrío Sánchez - MCP Application Development Foundation - C#

Todo lo que vaya aprendiendo de .NET, C#, ASP.NET, SQL Server, etc, lo compartiré con vosotros.

El autor:

Óscar Sotorrío Sánchez
Contacto Send mail

Encuéntralo

Álguien dijo...


Debería haber un gran almacén de arte en el mundo al que el artista pudiera llevar sus obras y desde el cual el mundo pudiera tomar lo que necesitara.

Ludwig van Beethoven

Programación Orientada a Objetos en .NET con C# (5ª parte)

2. Encapsulación

d-Miembros de una clase (constructores (1))

 

Los constructores son el punto de inicio de una clase. Esto quiere decir, que cuando creamos un objeto a partir de una clase, el primer código que se ejecuta es el código contenido en el cuerpo del constructor. Por esta razón, los constructores normalmente se utilizan para inicializar los campos o variables de la clase.

Una clase obligadamente siempre tiene que tener un constructor. En le caso de que no implementemos ninguno, será el propio compilador de C#, el que asigne forzosamente uno a nuestra clase y será utilizado por el compilador para realizar operaciones internas de cara a la construción de objetos. A este constructor, se le conoce con el nombre de constructor predeterminado.

Ahora vamos a implementar un constuctor a nuestra clase  'Empleado' que utilizamos en el artículo anterior. ¡Veamos como!.

   class Empleado
   {
      
public string Nombre;

      public 
Empleado()
      {
         Nombre 
"Pablo";
      
}
   }

Para intentar hacerlo más didáctico he añadido a la clase un campo 'Nombre'. Este campo es inicializado desde el constructor como comentamos anteriormente. Ahora, cuando creamos un objeto a partir de esta clase, el constructor asignará en primer lugar 'Pablo' a la variable 'Nombre'. 

 

Como se puede apreciar, el constructor esta compuesto de 4 partes:

1- Modificador de accesibilidad: Pueden ser declarados como public, protected. internal, protected internal y private.

2- Identificador del constuctor: Siempre coincide con el nombre de la clase, en este caso 'Empleado'

3- Paréntesis de parámetros: Dentro de los paréntesis podemos asignar todos lo parámetros que necesitemos. Luego veremos un ejemplo.

4- Cuerpo del constructor: Aquí se ejecuta el código del constructor.

 

Sobrecarga de constructores. 

Una clase puede tener más de un constructor. En realidad, tantos como necesitemos.

Para implementar más de un constructor en una misma clase, es necesario que los constructores se diferencien o bien en el tipo de parámetros o en el número de ellos. Continuando con el ejemplo anterior:

   class Empleado
   {
      
public string Nombre;

      public 
Empleado()
      {
         Nombre 
"Pablo";
      
}

      
public Empleado(string Nom)
      {
         Nombre 
Nom;
      
}
   }

Ahora tenemos dos constructores en la clase 'Empleado'. Uno sin parámetros y otro con un parámetro de tipo System.String. Ambos constructores se utilizan para inicializar el campo Nombre.

Cada constructor implementado en una clase nos indica como podemos o debemos utilizar la clase para construir los objetos a partir de ella.

 

Construir objetos.

Para construir un objeto en nuestro código a partir de una clase utilizaremos el operador new de la siguiente forma.

 

      NombreClase  NombreObjeto  =  new  Constructor; 

 

        Empleado Empleado1 = new Empleado();

 

El operador new reserva espacio en la memoria para el objeto creado. En algunas fuentes llaman a esto instanciar un objeto. No debemos asustarnos por esta "palabreja". Instanciar un objeto es cargarlo en la memoria y para ello utilizamos el operador new.

Posiblemente, todo esto sea más facil de enterder si lo vemos paso a paso.

Primero creamos un objeto de tipo 'Empleado'.

 

        Empleado Empleado1;

 

Y una vez que tenemos el objeto creado, podemos cargarlo en la memoria por medio del operador new.

 

        Empleado1 = new Empleado();

 

En este caso, hemos utilizado de la clase 'Empleado' el constructor sin parámetros. Por lo tanto el objeto 'Empleado1' tendrá el campo 'Nombre' con el valor de Pablo. De hecho, cualquier objeto creado a partir de la clase con este constructor tendrá el mismo valor para 'Nombre'.

Pero también podiamos haber procedido así:

 

        Empleado Empleado2 = new Empleado("Jorge");

 

De esta forma, el objeto 'Empleado2' tendrá Jorge como valor del campo 'Nombre'.

 

Es lógico pensar que los constructores nos indican como podemos crear los objetos a partir de la clase. Utilizando un constructor u otro, los objetos se irán cargando en la memoria con unos valores u otros.


Posted by Oscar.SS on domingo, 15 de febrero de 2009 0:08
Permalink | Comentarios (0) | Post RSSRSS comment feed

Programación Orientada a Objetos en .NET con C# (4ª parte)

2. Encapsulación

c- Clases en C# (declaración y accesibilidad)

 

En el artículo anterior vimos como la encapsulación estaba directamente relacionada con las clases y la relación de estas con los objetos. Ahora vamos a ver cómo hacer uso de las clases desde nuestro código C#.

Definir una clase en C# es muy sencillo. Solo tenemos que utilizar la palabra reservada "class" seguida del nombre que queramos darle a nuestra clase.

    class Empleados
    {
 
    }

De esta forma ya tenemos una clase (también llamado tipo definido por el usuario) con la que podemos empezar a trabajar. Antes de continuar hablando de los miembros que podemos implementar en una clase debemos hacer una pausa para hablar de los modificadores de accesibilidad.

 

Modificadores de accesibilidad en .NET

Los modificadores de accesibilidad permiten definir el nivel de acceso que tendrán los tipos y los miembros de estos tipos para otros usuarios. Entendiendo por otros usuarios a otros tipos que pertenezcan al mismo proyecto o incluso a un proyecto distinto. Veamos estos modificadores por orden de accesibilidad de mayor a menor.

- public: Un tipo o miembro declarado public puede ser usado desde cualquier código que pertenezca al mismo proyecto o a un proyecto diferente. Es el modificador menos restrictivo de todos.

- internal: Un tipo o miembro declarado internal puede ser usado desde cualquier código que pertenezca al mismo proyecto. Debemos verlo como un tipo o miembro interno de nuestro proyecto.

- protected: Un tipo o miembro declarado protected solo puede ser usado por el código de la misma clase o por código de una clase derivada.

- protected internal: Es una mezcla de los dos anteriores. Puede ser usado por código que pertenezca al mismo proyecto y por código de la misma clase o de una clase derivada.

- private: Un tipo o miembro declarado private solo puede ser usado por código de la misma clase o estructura. Es el más restrictivo de todos los modificadores de accesibilidad.

Todos los tipos (y los miembros de los tipos) tienen un determinado tipo de accesibilidad predefinido. Es decir, si no utilizamos ninguno de los anteriores, el compilador de C# asignará uno por defecto. Normalmente en este estudio hablaremos de las clases por ser el tipo definido por el usuario más flexible y potente, pero en la siguiente tabla podemos ver que modificadores de accesibilidad por defecto corresponden a cada tipo.

 

 

TIPOS

Declarado en ámbito de namespace

Accesibilidad predeterminada

Accesibilidad declarada permitida

Enum

Public

Internal

Public

Class

Internal

 

Internal

Public

Interface

Public

Internal

Public

Struct

Internal

Internal

                 Public               

 

 Nota: Los miembros de las clases tales como métodos y propiedades pueden ser declarados utilizando cualquiera de los modificadores de accesibilidad, teniendo como accesibilidad predeterminada private.

Según todo lo explicado, es fácil deducir que en la declaración de nuestra clase  Empleado, como no especificamos un modificador de accesibilidad, tendrá la accesibilidad Internal.

Bueno, ahora que tenemos claro (eso espero) todo este lío de los modificadores de accesibilidad, vamos a ver en profundidad los miembros que normalmente implementaremos en una clase.

La forma de implementar una clase dependerá en gran medida de las exigencias de nuestro código y de la finalidad de la clase misma. Pero normalmente una clase será un contenedor para los siguientes miembros:

- Constructores.

- Atributos.

- Propiedades.

- Campos.

- Métodos.

- Otros tipos.

- Destructor.

 

 En los artículos siguientes trataremos cada uno de estos miembros en profundidad. La comprensión de los conceptos relacionados con la implementación de los miembros de una clase es de suma importacia para enfocar los restantes pilares (herencia y polimorfismo) de la programación orientada a objetos.

 


Posted by Oscar.SS on lunes, 08 de diciembre de 2008 2:50
Permalink | Comentarios (0) | Post RSSRSS comment feed

Programación Orientada a Objetos en .NET con C# (3º parte)

2. Encapsulamiento

b- Clases y objetos


Las clases debemos verlas como moldes o plantillas para crear (instanciar) diferentes objetos a partir de ellas.


Un ejemplo. Supongamos que en una fábrica disponen de un molde para diseñar piezas de diferentes materiales. Este molde puede ser llenado con materia plástica, metal fundido o vidrio líquido, solo es un ejemplo…que ningún Ing.Industrial proteste ;-).


Al enfriarse el molde y su interior, tendremos 3 objetos con medidas idénticas pero cada uno tendrá sus características propias en función del material que se ha utilizado para su construcción.


De la misma forma una clase permite crear (instanciar) diferentes objetos que tendrán los mismos métodos y atributos pero cada uno guardará en la memoria unos datos diferentes.


Nota: He utilizado 2 veces el termino 'instanciar' en similitud con 'crear'. Instanciar un objeto es cargarlo en la memoria.


Otro ejemplo. Para administrar las necesidades de una empresa en relación con sus empleados podemos necesitar una clase llamada 'empleados'. Los atributos de esta clase pueden ser el nombre y la dirección de los empleados. De esta forma necesitaremos métodos para manipular estos atributos, es decir, un método para establecer el nombre y otro para obtenerlo. Y lo mismo para el dato de la dirección. Necesitaremos un método que nos permita cambiar la dirección de un empleado en el caso de que este cambie de domicilio.


Una vez tenemos nuestra clase definida, podemos cargar en memoria (instanciar) distintos objetos de esta clase. Dado que una imagen vale más que mil palabras, veamos el siguiente diagrama.

Diagrama de Clase y Objetos


Como podemos ver en la figura, la clase funciona como un contenedor (encapsulación) permitiendo agrupar tanto los datos (atributos) como los métodos.


También observamos que hemos creado dos objetos diferentes de la misma clase. Cada uno con sus datos particulares de nombre y dirección. Pero en los objetos no hemos incluido los métodos de la clase.


¿Porque?. Muy sencillo, porque cada objeto carga en memoria una copia de los datos propios (atributos) pero los métodos solo existen en la clase y son compartidos por todos los objetos creados a partir de la clase.


Esto quiere decir que cuando Pedro cambie de dirección, hará una llamada al método de la clase 'EstablecerDirección' y guardará los nuevos datos en la memoria del objeto Empleado1. Y exactamente lo mismo para el Empleado2, compartiendo de esta forma los métodos de la clase.


En la primera parte de este estudio dijimos que nuestra filosofía es que ¡todos son objetos!. ¿Pero qué pasa con las clases?, ¿son o no son objetos también?, ¿nos hemos contra decido?.


Las clases también son objetos (el molde de la fábrica es un objeto), de hecho en los lenguajes de .NET todo son objetos. Objetos que heredan de la clase base Object. Pero esto de la herencia lo veremos más adelante. De momento es suficiente con el concepto de que las clases son un tipo de objeto que nos permiten crear otros objetos con características similares.


En el siguiente artículo veremos cómo implementar clases e instanciar objetos por medio del lenguaje C#.


Posted by Oscar.SS on jueves, 30 de octubre de 2008 11:00
Permalink | Comentarios (2) | Post RSSRSS comment feed

Programación Orientada a Objetos en .NET con C# (2ª parte)

2. Encapsulamiento

a- Definición


Cuando hablamos de encapsulación en un lenguaje orientado a objetos (y algunos que no lo son totalmente) hablamos necesaria y evidentemente de las clases.
Como mencionamos anteriormente los objetos tienen dos características que los definen.


- Los atributos: que es donde se almacenan los datos del objeto.


- Los métodos: que nos permiten manipular y acceder a estos datos.


Por lo tanto, la encapsulación nos facilita el poder agrupar en una sola entidad de código, tanto los datos (atributos) como la forma de manipularlos (métodos).
Esta funcionalidad la conseguimos con las clases, en las que "introduciremos" los atributos y métodos de los objetos.


Una de las ventajas de la encapsulación es la facilidad de cambiar y reutilizar el código. Si en algún momento de la vida de un proyecto, necesita cambiar un atributo de la clase, solo tendrá que hacerlo en la definición de la clase y el cambio de propagará por todos los objetos creados a partir de esta clase.


En el siguiente apartado hablaremos de la relación de las clases y los objetos.


Posted by Oscar.SS on miércoles, 15 de octubre de 2008 1:17
Permalink | Comentarios (0) | Post RSSRSS comment feed

Programación Orientada a Objetos en .NET con C# (1ª parte)

1. Introducción


¿Qué es un objeto?

Antesde nada deberíamos comenzar por saber que es un objeto para un lenguajede programación y que es un objeto para los lenguajes de la plataforma.NET.

En la vida real es muy fácil determinarque es un objeto. Por ejemplo cojamos un objeto cualquiera, unmartillo. Ahora pasemos a describir o explicar que es un martillo paraalguien que no sabe lo que es.

“Un martilloes una herramienta con un mango alargado (comúnmente de madera) con unacabeza pesada (comúnmente de metal) en su extremo, que se utiliza paradeformar o desplazar otros objetos”.

Seguroque álguien se está preguntando…¿Qué tiene que ver esto con laprogramación?. Pues bien, la respuesta es todo. En seguida lo vemos.

Prestemosatención a la definición que hemos dado de este objeto. Primeramentehemos mencionado a que “familia” pertenece este objeto.

“Un martillo es una herramienta…”

Seguido hemos descrito dos características o atributos del objeto.

“…con un mango alargado (comúnmente de madera) con una cabeza pesada (comúnmente de metal) en su extremo …”

A continuación hemos comentado cual es su función.

“…que se utiliza para deformar o desplazar otros objetos.”

Precisamenteesto es un objeto para un lenguaje de programación. Un fragmento decódigo (o bloque) fácilmente identificable que dispone de atributos ymétodos (o funciones).

¿Quieres másejemplos?. Supongamos que estas diseñando una aplicación de tipoadministrativo que actualiza los datos de una empresa. Esta empresaseguramente tiene empleados y clientes. Ambos, empleados y clientes,pueden ser objetos en nuestro código y en ambos podemos definir atributos (nombre, apellidos, dirección, teléfono, etc) y métodos(entrar y salir del trabajo, hacer pedidos, darse de alta como cliente,etc).

¿Otro ejemplo?. Hablemos ahora de unaaplicación bancaria. Una cuenta de ahorros puede ser un objeto ennuestro código con atributos (nombre de cliente, número de cuenta,saldo, tipo de interés, etc) y con métodos (ingreso, reintegro, mostrarsaldo actual, etc)

En el ejemplo del martillovimos también que pertenecía a una familia de objetos, la familia delas herramientas. Este concepto tiene que ver con la herencia, locomentaremos más adelante.

Por el momento es suficiente con tener la idea básica de que los objetos disponen de atributos y métodos.

 

¿Qué es un lenguaje orientado a objetos?

Ahoraque ya tenemos claro (más o menos) que es un objeto para un lenguaje deprogramación, parece lógico responder a esta pregunta.

Seconsidera que un lenguaje está totalmente orientado a objetos cuando escapaz de soportar las siguientes cualidades; encapsulación, herencia, ypolimorfismo.

Daremos brevemente una pequeñaintroducción de estos conceptos para que el lector comience afamiliarizarse con ellos. En los siguiente artículos profundizaremostodo lo posible en ellos por tratarse del pilar de la programaciónorientada a objetos.

- Encapsulamiento.Esta cualidad permite agrupar en un mismo bloque de código losatributos (que contendrán los datos) y los métodos (que manipularánestos datos).

- Herencia.Es la cualidad que permite que un objeto derive de otro implementandotoda su funcionabilidad, es decir, adquiriendo todas los atributos ymétodos del objeto base.

- Polimorfismo.Posiblemente esta cualidad es la más difícil de entender y de explicar.Por el momento basta con decir que permite que varios objetos distintostengan la misma funcionabilidad (atributos y métodos).

 

¿Qué es esto de la abstracción de datos?

Supongoque hasta ahora todo lo dicho es un poco confuso. Sobre todo si es laprimera vez que el lector se enfrenta con estos conceptos que sonbastante abstractos.

No hay que desesperar,al principio cuesta bastante pero poco a poco, el lector seacostumbrará a esta manera de pensar que no deja de ser un ejercicio deabstracción.

¿Por qué abstracción?. Es unaforma de coger los datos reales de la vida cotidiana e implementarlosen líneas de código. Por ejemplo, un coche es un objeto tangible en lavida real, se puede tocar, conducir, etc. Pero en el mundo de loslenguajes de programación es algo intangible.

Enalgunos libros, se refieren a la “abstracción de datos” como a laposibilidad de acceder a los datos de un objeto sin importarnos comoestén internamente implementados en el objeto.

Personalmenteopino que este tipo de definiciones no ayudan en nada a la comprensiónde la programación orientada a objetos. Por lo menos a mi no meayudaron. Por lo tanto, en la medida de lo posible intentaremosevitarlas en este estudio.

Seamos prácticos,de momento es suficiente con que el lector, sobre todo los que vienende lenguajes procedurales (o secuenciales), cambien el chip y comiencena pensar que la vida real puede ser representada por objetos deprogramación. Nuestro axioma es que…¡¡todo son objetos!!

En el siguiente artículo trataremos la encapsulación a fondo.


Posted by Oscar.SS on miércoles, 24 de septiembre de 2008 17:24
Permalink | Comentarios (0) | Post RSSRSS comment feed