Hasta ahora, hemos escrito código que se ejecuta de arriba a abajo, guardando variables aisladas en funciones. En POO, cambiamos de mentalidad: Agrupamos los datos y comportamientos relacionados en un solo bloque estructurado. Piensa en crear un molde (Clase) del cual puedes sacar galletas individuales (Objetos).
Clases y Objetos (`new`)
Una Clase es el plano o receta. Define qué propiedades tendrá algo. Un Objeto (o instancia) es aquello concreto que creaste usando la palabra new.
Creando Clases e instanciando con 'new'
CSHARP
1// Definición de una clase (el molde del Perro)
2class Perro
3{
4// Sus propiedades (datos)
5publicstring nombre;
6publicstring raza;
7
8// Su comportamiento (métodos)
9publicvoidLadrar()
10 {
11Console.WriteLine($"Soy {nombre} y hago: ¡Guau!");
12 }
13}
14
15class Program
16{
17staticvoidMain()
18 {
19// Creamos un nuevo objeto Perro desde el molde
20 Perro miPerro = newPerro();
21
22 miPerro.nombre = "Rex";
23 miPerro.raza = "Golden";
24
25// Y lo usamos
26 miPerro.Ladrar();
27 }
28}
Constructores
En el ejemplo anterior creamos un Perro y *después* le asignamos nombre. ¿Qué pasa si quiero que nazca con un nombre obligatorio? Usamos un Constructor (un método especial que tiene el mismo nombre que la clase).
Uso de Constructores
CSHARP
1class Perro
2{
3publicstring nombre;
4
5// Nuestro Constructor: Se ejecuta mágicamente al hacer 'new'
6publicPerro(string nombreInicial)
7 {
8 nombre = nombreInicial;
9 }
10}
11
12class Program
13{
14staticvoidMain()
15 {
16// Ya nace con nombre desde el inicio
17 Perro miPerro = newPerro("Firulais");
18Console.WriteLine(miPerro.nombre); // Firulais
19 }
20}
Propiedades Automáticas { get; set; } y Encapsulamiento
A diferencia de los campos públicos simples (public string nombre;), las Propiedades nos permiten proteger los datos (Encapsulamiento). En C#, este concepto se ha vuelto tremendamente elegante con los Auto-Implemented Properties.
Protegiendo nuestras Clases
CSHARP
1class Personaje
2{
3// Propiedad con 'get' (solo lectura desde afuera)
4// y 'set' (asigna el dato desde adentro)
5publicint Vida { get; privateset; }
6
7publicPersonaje()
8 {
9 Vida = 100; // Inicia con vida plena
10 }
11
12publicvoidRecibirDano(int cantidad)
13 {
14 Vida -= cantidad;
15 }
16}
17
18class Program
19{
20staticvoidMain()
21 {
22 Personaje hero = newPersonaje();
23Console.WriteLine(hero.Vida); // Todo bien, lee 100
24
25// Error: No puedes hacer esto porque tiene "private set"
26// hero.Vida = 999999;
27
28// Correcto: Deberás usar el método para dañarlo
29 hero.RecibirDano(20);
30Console.WriteLine(hero.Vida); // Ahora es 80
31 }
32}
👨💻 Ejercicio Práctico
Misión: Constructores en Acción
Crea una clase Mascota con propiedades `Nombre` y `Edad`. Añádele un Constructor que asigne esos valores al nacer, y hazle un `new` desde el Main.
👁️ Ver solución propuesta
Código
CSHARP
1class Mascota
2{
3publicstring Nombre { get; set; }
4publicint Edad { get; set; }
5
6// Constructor
7publicMascota(string nombreInicial, int edadInicial)
8 {
9 Nombre = nombreInicial;
10 Edad = edadInicial;
11 }
12}
13
14class Program
15{
16staticvoidMain()
17 {
18 Mascota miGato = newMascota("Michi", 3);
19Console.WriteLine($"Mi mascota es {miGato.Nombre} y tiene {miGato.Edad} años.");
20 }
21}
👨💻 Ejercicio Práctico 2
Misión: Diseñando tu Libro
Declara una clase Libro con propiedades Titulo y Autor (usando gets y sets automáticos). Instánciala y asígnale datos.
👁️ Ver solución propuesta
Código
CSHARP
1class Libro
2{
3publicstring Titulo { get; set; }
4publicstring Autor { get; set; }
5}
6
7// En Main...
8Libro m = newLibro();
9m.Titulo = "El Hobbit";
10m.Autor = "Tolkien";
👨💻 Ejercicio Práctico 3
Misión: La Bóveda del Banco
Crea la clase Cuenta. Su saldo debe tener un private set para que nadie le cambie el valor desde afuera excepto su propio método Depositar(int cantidad).
👁️ Ver solución propuesta
Código
CSHARP
1class Cuenta
2{
3publicint Saldo { get; privateset; }
4publicvoidDepositar(int cr)
5 {
6 Saldo += cr;
7 }
8}
👨💻 Ejercicio Práctico 4
Misión: Gemelos independientes
Genera dos objetos distintos (`c1` y `c2`) de la clase Coche. Demuestra que si a uno le asignas marca "Ford" y al otro "Mazda", no se mezclan.
👁️ Ver solución propuesta
Código
CSHARP
1class Coche { publicstring Marca { get; set;} }
2
3// En Main
4Coche c1 = newCoche();
5c1.Marca = "Ford";
6Coche c2 = newCoche();
7c2.Marca = "Mazda";
8// Son independientes.
Ponte a prueba
Comprueba tus conocimientos sobre este tema realizando nuestro pequeño test.
QuizQuiz: Clases y Objetos
Son 5 preguntas de opción múltiple sobre esta lección. ¡Evalúa tus conocimientos!
Dato curioso: Microsoft lo presentó en 2000; C# 1.0 con .NET en 2002 (Anders Hejlsberg). Wikipedia
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.