Clases - Encapsulando datos y funciones.

En C#, existen dos tipos de datos: por referencia y por valor. Los datos por valor son aquellos que propiamente "almacenan" su valor; de ellos, podemos hablar de int, double, float, etc. Por otra parte, los datos por referencia son aquellos que "apuntan" a un sector de la memoria en donde está el valor ( o conjunto de valores ) albergados, con lo cual se pueden usar de una manera distinta, ya que no albergan en sí los datos; el ejemplo más claro de ellos son las clases.

La clase es la unidad fundamental de todo lenguaje orientado a objetos. Una clase es un nuevo tipo de dato definido por el programador, que "encapsula" tanto datos (ahora llamados campos), como funciones (o métodos). C# al ser un lenguaje 100% orientado a objetos, no permite que una ni un dato ni una función puedan ser definidos fuera de una clase, por lo que reafirmamos que la clase es la unidad elemental del paradigma orientado a objetos. Así, cuando creemos un nuevo tipo de dato predefinido ( la clase ) estaremos hablando de objetos.

Definiendo una clase

Recordando que una clase es un nuevo tipo de dato, pasaremos a definir uno propio, llamado MiClase. Como se había dicho anteriormente, una clase encapsula datos y funciones ( o campos y métodos, de ahora en adelante ). Nuestra clase MiClase tendrá consecuentemente dos enteros: sumando 1 y sumando2.

Una clase se declara con la palabra reservada class, seguida de su nombre:

 class MiClase { 
       ...
 }

Importante

El declarar una clase como un tipo de dato pro valor ( int, bool, etc ) es un error muy común en el desarrollo de clases. Procure recordar que una clase puede contener diversos tipos de campos, por lo que no es necesario que tenga que estar ligada directamente a uno de ellos.

Pero una clase, al igual que los campos y los métodos, puede recibir modificadores de alcance y de almacenamiento. De esta forma, sería bueno que nuestra clase pudiera ser accesada desde cualquier otro archivo o aplicación, por lo cuál antepondremos la palabra public:

 public class MiClase { 
       ...
 }

Ahora procederemos a declarar nuestros dos enteros ( int ) , sumando1 y sumando2, que se declaran como siempre:

 public class MiClase {
       
	int sumando1, int sumando2;

 }

Nótese que no fue necesario anteponer int a cada dato, sino que simplemente se colocarlo al principio de la declaración de los dos enteros. Pero aunque están declarados, no tienen asignado un valor, por lo que no es mala idea darles un valor por defecto, en este caso, 0 a ambos:

 
 public class MiClase { 
        
        int sumando1=0, int sumando2=0; 
 
 } 

Bien, ya tenemos nuestra clase. ¿Qué tal si la usamos?, recordando que e sun nuevo tipo de dato, procederemos a crear un nuevo objeto del tipo MiClase en el método Main (), como lo sería un int o un bool, usando la palabra new, con la que estamos especificando que estamos creando un nuevo grupo de "campos-y-métodos":

 
        MiClase clase = new MiClase();

Importante

La omisión de los paréntesis en la creación de un nuevo objeto es un error muy común. Recuérdelo en función de que al usar la palabra new, en realidad estamos llamando a un método, el cual se encarga de crear un dato del tipo pre-definido.

¡Perfecto! ya tenemos nuestro primer objeto clase, de tipo MiClase, el cual tiene dos enteros. ¿Qué tal si trabajamos con ellos? ¡Oh sorpresa! simplemente no podemos. ¿Por qué?, pues porque los datos en C# qu están contenidos en una clase por defecto no son visibles hacia el mundo exterior. Por lo tanto, el querer acceder a ellos, el compilador nos avisaría de un error.

Dada esta situación, crearemos un método, llamado Sumar, el cualpara de encargará de regresarnos la suma de ellos. Un método se define como si fuera un campo, con la excepción de tener especificados sus argumentos:

 public class MiClase {

        int sumando1=0, int sumando2=0;

        public int Sumar ()
        {

               return (sum1+sum2);

        }
  
 }  

Hemos añadido además la palabra public, asegurándonos de que pueda ser usada por cualquier parte de la aplicación. Los paréntesis han quedado vacíos, pues no requerimos que algún otro dato sea especificado. Finalmente, colocamos la palabra return, la cuál se encarga de devolver un dato, en este caso, la suma de sum1 y sum2.

Todo marcha a la perfección: tenemos una clase, ella tiene dos enteros, un método que nos dice cuál su suma ... ¿y qué acerca de modificar esos enteros? Bueno, es necesario que implementemos otro método, DefinirSumandos, el cuál recibira dos enteros, que serán asignados a nuestros enteros contenidos en el objeto.

 
 public class MiClase { 
 
        int sumando1=0, int sumando2=0; 

        public void DefinirSumandos ( int sum1, int sum2 )
        {

                this.sumando1 = sum1;
                this.sumando2 = sum2;

        }
 
        public int Sumar () 
        { 
 
                return (sum1+sum2); 
 
        } 
   
 }   

De este modo, ya tenemos contemplado manejar con cierta libertad los objetos de tipo MiClase. No obstante, hay que observar el uso de la palabra this, que hace referencia a al actual objeto. Esta palabra indica que "el actual objeto de tipo MiClase", tiene un campo llamado sumando1, y otro llamado sumando2, los cuales recibirán el valor de sum1 y sum2, especificados en el prototipo del método.

¡Perfecto! ahora sí podemos usar la clase con libertad:

 
// Programa que muestra el uso de métodos y campos en una clase definida por
// el programador.

using System;

 public class MiClase {

        private int sumando1=0, sumando2=0;

        public void DefinirSumandos ( int sum1, int sum2 ) 
        {

                this.sumando1 = sum1;
                this.sumando2 = sum2;

        }

        public int Sumar () 
        {

                return (sumando1+sumando2);

        }

 }

 public class Clases {

        public static void Main ( string[] args ) {

                MiClase clase = new MiClase();
                
                Console.WriteLine("La suma inicial es : {0}", clase.Sumar() );
                
                clase.DefinirSumandos (54, 96);

                Console.WriteLine("La suma ahora es : {0}", clase.Sumar() );

        }

 }

Después de haber compilado, si todo fue bien, deberíamos ver:

				[zero@localhost c#]$ mono clases.exe
				 La suma inicial es : 0
				 La suma ahora es : 150
				[zero@localhost c#]$