Curso C# con Mono – Declaración de clases y estructuras

Curso C# con Mono – Declaración de clases y estructuras

Llegados a este punto, podríamos hablar tan profundamente y durante tanto tiempo sobre clases, objetos, métodos, atributos… que desvirtuaría el sentido de este curso. Supongo que tenéis nociones básicas de todo este paradigma de la orientación a objetos y veremos cómo implementar clases en C# con Mono.

Podríamos decir a muy grosso modo que:

  • Las clases son la unidad básica de estructuramiento en un programa de C#
  • Las estructuras son una herencia de lenguajes más antiguos, como C, donde creamos un grupo común para varias variables, sin atribuirles posibilidades de ejecución (métodos)

En C#, las estructuras pueden tener métodos básicos para la lectura o modificación de las variables.

¿Cómo crear una clase?

Digo cómo crear y no cómo declarar una clase, porque el curso está basado en MonoDevelop y tras crear una clase con el interfaz, veremos cómo se declara en el código.

Declaración de nueva clase con MonoDevelop

Dentro del espacio de nombres, a la izquierda de la interfaz, hacemos: clic derecho, “Añadir”, “Nuevo archivo”, “Clase vacía” e indicamos el nombre. Se nos creará un esqueleto básico de clase como el que sigue:

using System;

namespace holaMundo
{
	public class persona
	{
		public persona ()
		{
		}
	}
}

Veamos ahora la clase un poco más rellena. Como veréis, estoy dentro del mismo espacio de nombres en el que hemos hecho los ejemplos anteriores, “holaMundo”. Incluimos: atributos, métodos para manejar los atributos, el constructor y un método de ejemplo.

using System;

namespace holaMundo
{
	public class persona
	{
		// atributos
		string nombre;
		int edad;

		// propiedades: métodos para manejar los atributos
		public string Nombre {
			get { return nombre; }
			set { nombre = value; }
		}

		public int Edad {
			get { return edad; }
			set { edad = value; }
		}

		// constructor
		public persona (string _nombre, int _edad)
		{
			// usamos los métodos para manejar atributos en lugar de this.nombre
			Nombre = _nombre;
			Edad = _edad;
		}

		// método para imprimir datos de la instancia
		public void print()
		{
			System.Console.WriteLine("Nombre: " + nombre + " - Edad: " + edad.ToString());
		}
	}
}

Aunque la sintaxis os resultará bastante familiar si habéis trabajado con lenguajes como Java o C++, hay alguna curiosidad que querría comentar:

Los getter y setter, también llamadas propiedades, son unos métodos que se encargan de interactuar con los atributos, sin necesidad de usar los típicos y molestos: getVariable() y setVariable(valor). Se integran muy bien en el código y al hacer llamadas del estilo Edad = algo o algo = Edad, se llamarán de forma automática.

MonoDevelop crea las cases automáticamente como public, de esta forma puede tenerse acceso desde fuera de su ensamblado.

Los atributos de las clases también pueden tener diferentes niveles de acceso. Por defecto, si no se indica es private. Veamos las diferencias entre ellos:

  • public: Accesible desde otras clases. No recomendable, mejor private y con propiedad para tener acceso desde fuera.
  • protected: Hace que el atributo sea accesible directamente desde otras clases derivadas de aquella en la que está declarado, pero no desde el resto.
  • private: Opción por defecto. La variable sólo será accesible desde su propia clase.
  • internal: Sólo accesible desde el propio ensamblado.

Como he dicho, hay muchas más opciones y mucho más que comentar en este apartado, pero si conocéis orientación a objetos, con esto tendréis suficiente.

De todas formas, vía comentarios, responderé posibles dudas que puedan surgir :).

Estructuras

Antes de terminar, haremos una breve introducción a este tipo de mecanismo, que usamos para agrupar distintas variables en torno a una unión común, sin aportar ningún tipo de método para su manejo (esto las distingue directamente de las clases), pero a diferencia de lenguajes más antiguos, permitiendo que tengan variables privadas y propiedades para su manejo.

Veamos cómo se declaran y cómo se hacen llamadas a sus miembros:

public struct direccion{
	string calle;
	int numero;
	char letra;

	public string Calle{
		get { return calle; }
		set { calle = value; }
	}

	public int Numero{
		get { return numero; }
		set { numero = value; }
	}

	public char Letra{
		get { return letra; }
		set { letra = value; }
	}
}

Las llamadas las haremos a las propiedad, que podemos cambiarlas si nos interesan en el código anterior con funciones más complejas, llamadas a BB.DD., etc.; en definitiva, con lo que necesitemos.

direccion personal;
personal.Calle = "Avenida sin nombre";
personal.Numero = 6;
personal.Letra = 'C'

Entregas anteriores