Clases.

El lenguaje de programación C# va mucho más allá del modelo de programación secuencial que hemos visto hasta ahora, es decir, un modelo de programación en el que se siguie una línea de ejecución lógica "de inicio a fin" o "de arriba a abajo". Ya hemos visto que la sentencia 'if' puede modificar el flujo de ejecución en el código fuente, así como otras sentencias de control que veremos más adelante harán cosas aún más importantes con este flujo de ejecución.

Pero como he dicho, C# va mucho má allá. La POO, o "programación orientada a objetos", es un modelo que utiliza objetos ligados mediante mensajes que solucionan problemas. El concepto de POO puede parecer difícil de entender al principio, pero te aseguro que realmente es muy sencillo y lo entenderás a la perfección. Casi todo se resume en algo así: objetos son entidades independientes que poseen, principalmente, atributos y propiedades que los definen en esencia, y un conjunto de métodos mediante los cuáles muestran su comportamiento.

Como sigues sin enterarte de nada, vamos con un ejemplo: una entidad bancaria posee, además de mucho dinero, otras cosas como las cuentas bancarias. Esas cuentas bancarias tienen asociadas, por ejemplo, un número y un nombre. Y pueden ser corrientes o de crédito. Y además la entidad bancaria realiza operaciones con ellas, como reintegros, ingresos o transferencias. Pues bien, atención: la cuenta bancaria es un objeto que tiene atributos (número y nombre), propiedades (corriente o de crédito), y métodos (sacar dinero, ingresar dinero o hacer una transferencia) que dan un resultado (el saldo).

Ahora imaginemos que, teniendo en cuenta el objeto anterior, nosotros controlamos la entidad bancaria. Evidentemente, y deberías haberlo imaginado antes de leerlo, sería conveniente crear tantos objetos de estos como clientes tenemos. Así, por cada nuevo cliente de nuestra entidad bancaria, crearemos un nuevo objeto idéntico al de antes. Llegará un momento en que tendremos multitud de nuevos objetos de cuenta bancaria, pero no será ningún problema porque cada vez que tengamos que hacer operaciones de un cliente, lo haremos sobre la cuenta bancaria de ese cliente, es decir sobre el objeto que representa la cuenta bancaria de ese cliente.

Según habrás deducido del párrafo anterior, el resultado de la operación sobre una cuenta bancaria de un cliente puede repercutir en el estado de la cuenta bancaria de otro cliente. Por ejemplo, si saco mi dinero para ingresarlo en la cuenta de un amigo. En este momento estaríamos actuando sobre una cuenta e, indirectamente, sobre otra, lo que puede parecer que complica el escenario inicial. Más adelante veremos que no hay ningún problema en este tipo de interacciones entre objetos, ya que C# posee potentísimos mecanismos de abstracción como son el encapsulamiento y la herencia, que estudiaremos más adelante.

Así pues, podríamos definir las clases como los moldes de los objetos que vamos a crear, pero simplemente como moldes, ya que posteriormente estas clases recibirán interactuaciones de otras clases que modificarán sus atributos y propiedades.

Un objeto de una clase se crea en el mismo momento que se invoca al operador 'new'. Fíjate bien en el siguiente ejemplo:

ClaseCuenta cuenta1 = new ClaseCuenta();
ClaseCuenta cuenta2 = new ClaseCuenta();

Si te fijas bien, las dos sentencias son iguales excepto que tienen diferentes nombres de los nuevos objetos creados. En la primera sentencia creamos un nuevo objeto de la clase 'ClaseCuenta' y lo llamamos 'cuenta1'; en la segunda sentencia creamos otro nuevo objeto de la clase 'ClaseCuenta' y lo llamamos 'cuenta2'. Es decir, ahora tenemos dos objetos ('cuenta1' y 'cuenta2') de la clase 'ClaseCuenta', esencialmente diferentes e independientes entre sí. Únicamente tienen en común que han sido creados con el mismo molde, la clase 'ClaseCuenta'. A esta operación de crear objetos nuevos también se la denomina "crear una nueva instancia" de la clase.

Veamos este ejemplo pero integrado dentro de un programa:

class MiPrimerPrograma
{
    public static void Main()
    {
        CCuenta cuenta1 = new CCuenta();
        CCuenta cuenta2 = new CCuenta();
    }
}
class CCuenta
{
    public Cuenta() { }
}

Ahora el programa tiene dos clases: 'MiPrimerPrograma' y 'CCuenta'. El punto de entrada de la aplicación es el método 'Main', y dentro de él se crean dos instancias de la clase 'CCuenta'. La clase 'CCuenta' solamente tiene un constructor (ya lo veremos más adelante qué es un constructor) y no tiene atributos, ni propiedades, ni métodos ni nada, está vacía. Para el caso del ejemplo poco nos importa que la clase 'CCuenta' esté vacía. Lo único que importa ahora es entender que hemos creado dos objetos, o dos instancias de la clase 'CCuenta'.