jueves, 3 de octubre de 2013

Clases en C#

Tabla de Contenido

0. Introducción
1. Clases en C#
2. Declaración de una Clase
3. Creación de Objetos
4. Herencia
5. Conclusiones
6. Glosario
7. Referencias

0. Introducción

A medida que hemos ido avanzando se han identificado los elementos de construcción del lenguaje C# que permiten a un programador crear aplicaciones básicas pero útiles. Ahora es el momento de entrar en detalles específicos: las clases. Estos son los tipos de datos por referencia más comunes, y por supuesto, necesitan de una atención especial para comprender sus partes, cómo definirlas, y usarlas correctamente en la producción de software.

1. Clases en C#

Una clase es un tipo de dato por referencia que está compuesta básicamente por campos y métodos (aunque más adelante veremos otros elementos integrales de esta construcción). Además, si de tipos de datos por referencia se trata, la clase es la construcción más usada de todas (esto se ve en el volumen de definiciones que componen la biblioteca de .NET), y los mismos tipos personalizados que puede crear el propio programador a partir de un modelo generado a partir del mundo de la comprensión del problema.

Por otro lado, a una clase la podemos ver como un plan de diseño o molde del cual se pueden instanciar o crear objetos particulares para interactuar a través de mensajes con otros objetos de otras clases, además compartir información mutuamente o en un sentido en particular. En la Figura 1 se puede apreciar el ejemplo de la clase car, y que a partir de este molde o plantilla se puede crear objetos con características particulares: color, modelo, etc.: polo, mini, y beetle, por ejemplo.
Class and objects
Figura 1.  Relación entre clase y objeto [1].
Veamos cómo se implementa la definición de la clase Carro en código C#:
En el momento en que pasemos a temas más complejos, veremos que una clase más sofisticada puede contener los siguientes elementos de definición:
  • Atributos y modificadores de clase: public, internal, abstract, sealed, static, unsafe, y partial. Todos los anteriores preceden a la palabra clave class [2].
  • Delante del identificador de la clase (como en Carro) se puede especificar parámetros de tipos genéricos, clase base (en herencia), o interfaces.
  • El cuerpo de la clase puede contener [3]:
    • Métodos
    • Propiedades
    • Índices
    • Campos
    • Constructores
    • Operadores sobrecargados
    • Tipos anidados (por ejemplo una clase anidada)
    • Un finalizador.
[Nota: En artículos posteriores veremos con más detalles todos estos elementos para tener claro su concepto teórico y práctico.]

2. Declaración de una Clase

Para la definición de una clase debemos utilizar la palabra clave class. En el código fuente C# de ejemplo que se muestra a continuación:

Archivo C# Cliente.cs [enlace alternativo]:
Podemos especificar el grado de visibilidad (ámbito, o alcance, si se prefiere). En este caso hemos declarado la clase como public. Esto permite a terceros usar la clase para instanciación de objetos, o herencia.

Seguido de la palabra clave class -línea 1- viene el identificador o nombre de la clase: Cliente. Entre las llaves de apertura ({) y cierre (}) se define todo el conjunto de miembros que van a ser parte, como lo son: métodos, campos, constructores, propiedades, índices, eventos, &c.

3. Creación de Objetos

Cuando tengamos tipos de datos por referencia definidos, en este casos una o más clases, lo que podemos hacer enseguida es crear objetos para aprovechar las capacidades que provee el tipo de dato.

La instanciación o creación de objetos se logra a través del asignador de memoria new (operador de instanciación) [4]. Así:

Cliente objetoCliente1 = new Cliente();

O en otro caso, donde sea necesario, sólo se realiza la definición del tipo de dato del identificador:

Cliente objetoCliente2;

A razón de que las variables sólo son referencias hacia los espacios de memoria que contienen los datos, podemos hacer que varias variables apunten a la misma dirección. Por ejemplo:

Cliente objetoCliente3 = new Cliente();
Cliente objetoCliente2 = objetoCliente3;

objetoCliente2 y objetoCliente3 son referencias al mismo objeto, en consecuencia, apuntan a la misma dirección de memoria.

4. Herencia

La herencia es sinónimo de reusabilidad. A través de la herencia podemos definir un nuevo tipo de dato por referencia a partir de uno ya existente. Más técnicamente, partimos de la existencia de un tipo de dato base del cual derivamos datos y comportamiento, al producto de esta operación -derivación-, la llamamos clase derivada.

La declaración de una clase derivada se lleva a cabo así:

Archivo C# AdministradorTI.cs [enlace alternativo]:
Cuando se lleva a cabo la operación de derivación, todos los miembros de la clase base son herados por la clase derivada (también las podemos llamar: clase hija).

La sintaxis en C# para derivar de una clase base consiste en separar por el token de dos puntos (:): AdministradorTI : Empleado.

Un tema relacionado con la herencia es el de la implementación de interfaces. Una interfaz es una declaración o contrato que está compuesto de métodos abstractos (sin implementación) y campos estáticos. La clase que implemente una interfaz deberá aceptar todo el contrato (implementar los métodos), de lo contrario se generará un error en tiempo de compilación.

Por otro lado, también podemos hablar de las clases abstractas. Éstas no son más que clases que tienen uno o más métodos sin implementar. La clase que herede de este tipo de clase deberá implementar los métodos vacíos (abstractos).

Para evitar la herencia de un tipo, en la declaración de la clase se debe preceder el modificador de clase sealed [6].

A tener en mente:
  • En C# sólo está permitada la herencia simple.
  • Para simular la herencia múltiple [5] se puede utilziar el concepto de interfaces.

5. Conclusiones

Hemos visto que las clases son tipos de datos por referencia de los que los programadores se pueden aprovechar para crear tipos de datos personalizados para adaptar el modelo del mundo del problema, y en consecuencia, construir la solución a partir de los artefactos definidos. Se ha demostrado cómo declarar una clases, y crear objetos (o instancias) a través del operador new. Finalmente se habló de herencia: la forma de reusar comportamiento y datos de tipos definidos por nosotros mismos u otros programadores.

6. Glosario

  • Alcance
  • Clase
  • Derivación
  • Objeto
  • Plantilla (Template)
  • Visibilidad

7. Referencias

[1]: Programming Concepts: Object-oriented programming (OOP) - Wikibooks, open books for an open world - http://en.wikibooks.org/wiki/A-level_Computing/AQA/Problem_Solving,_Programming,_Operating_Systems,_Databases_and_Networking/Programming_Concepts/Object-oriented_programming_(OOP)
[2]: class (C# Reference) - http://msdn.microsoft.com/en-us/library/0b0thckt.aspx
[3]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[4]: new (C# Reference) - http://msdn.microsoft.com/en-us/library/51y09td4.aspx
[5]: Multiple inheritance - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Multiple_inheritance
[6]: sealed (C# Reference) - http://msdn.microsoft.com/en-us/library/88c54tsw.aspx


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.