Lección 6 · ~14 min · ← Lección 5
Clases y objetos: datos con comportamiento
Una clase es un plano; un objeto es algo construido a partir de él. Las variables de tipo clase guardan una referencia a ese algo. Tres ideas: los campos guardan los datos, los constructores los preparan, los métodos actúan sobre ellos.
Una clase con todo encima
class CuentaBancaria
{
public string Titular; // campo: cada objeto tiene el suyo
public CuentaBancaria(string titular) // constructor: corre al hacer 'new'
{
Titular = titular;
}
public void Imprimir()
{
Console.WriteLine(Titular);
}
}
CuentaBancaria cuenta = new CuentaBancaria("Ada"); // constrúyela
cuenta.Imprimir();
Pieza a pieza: public = visible desde fuera de la clase. El constructor se llama igual que la clase y no tiene tipo de retorno — su trabajo es que el objeto sea válido en el instante en que existe. new reserva memoria y lo ejecuta.
Cada objeto es el suyo
class Perro
{
public string Nombre;
public Perro(string nombre) { Nombre = nombre; }
}
Perro a = new Perro("Ada");
Perro b = new Perro("Grace");
Console.WriteLine(a.Nombre);
Console.WriteLine(b.Nombre); // dos objetos, dos Nombre — sin compartir
static: pertenece a la CLASE, no a un objeto
class Contador
{
public static int Total = 0; // UNA copia, compartida por todo
public static void Incrementar()
{
Total++;
}
}
Contador.Incrementar(); // se llama sobre la clase — sin objeto
Contador.Incrementar();
Contador.Incrementar();
Console.WriteLine(Contador.Total);
Ya usas miembros static constantemente: Console.WriteLine, int.Parse, Math.Max — todos métodos sobre una clase, sin objeto de por medio. Regla práctica: static para utilidades y contadores compartidos, instancia para "cada uno tiene el suyo".
Propiedades: campos con cara pública
El estilo moderno de C# — las propiedades automáticas se parecen a campos pero son miembros con get/set:
class Rectangulo
{
public double Ancho { get; set; } // propiedad automática
public double Alto { get; set; }
public double Area()
{
return Ancho * Alto; // no hace falta escribir 'this.' — va implícito
}
}
Rectangulo r = new Rectangulo { Ancho = 3, Alto = 4 }; // inicializador de objeto
Console.WriteLine(r.Area());
El inicializador de objeto (new Rectangulo { … }) asigna propiedades justo después de construir — no hace falta un constructor con parámetros para la configuración simple.
this: cuando los nombres chocan
Dentro del código de instancia, this es "el objeto actual". Su trabajo principal: desambiguar un parámetro de un campo con el mismo nombre:
class Perro
{
private string nombre;
public Perro(string nombre)
{
this.nombre = nombre; // this.nombre = el campo; nombre = el parámetro
}
}
Consejo de estilo: nombrar los campos en PascalCase (Nombre) o con prefijo (_nombre) hace que this. casi nunca sea necesario — elige una convención por base de código.
Cuando los constructores van mal
En cuanto declaras CUALQUIER constructor, C# deja de proporcionar el vacío gratis — y new Persona() falla con CS1729. Solución: pasa los argumentos, o añade un constructor sin parámetros explícito.
Practica ahora
- Construye una clase
Libro: propiedades automáticasTitulo+Anio, un constructor con ambas, y un métodoDescribir()que devuelva"Titulo (Anio)". Crea dos libros, imprime ambos. - Añade un contador static
LibrosCreadosque el constructor incremente — demuestra que dos objetos lo comparten. - Siguiente lección: Lección 7 — Herencia e interfaces.