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)
2 class Perro
3 {
4 // Sus propiedades (datos)
5 publicstring nombre;
6 publicstring raza;
7
8 // Su comportamiento (métodos)
9 publicvoidLadrar()
10 {
11 Console.WriteLine($"Soy {nombre} y hago: ¡Guau!");
12 }
13 }
14
15 class Program
16 {
17 staticvoidMain()
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
1 class Perro
2 {
3 publicstring nombre;
4
5 // Nuestro Constructor: Se ejecuta mágicamente al hacer 'new'
6 publicPerro(string nombreInicial)
7 {
8 nombre = nombreInicial;
9 }
10 }
11
12 class Program
13 {
14 staticvoidMain()
15 {
16 // Ya nace con nombre desde el inicio
17 Perro miPerro = newPerro("Firulais");
18 Console.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
1 class Personaje
2 {
3 // Propiedad con 'get' (solo lectura desde afuera)
4 // y 'set' (asigna el dato desde adentro)
5 publicint Vida { get; privateset; }
6
7 publicPersonaje()
8 {
9 Vida = 100; // Inicia con vida plena
10 }
11
12 publicvoidRecibirDano(int cantidad)
13 {
14 Vida -= cantidad;
15 }
16 }
17
18 class Program
19 {
20 staticvoidMain()
21 {
22 Personaje hero = newPersonaje();
23 Console.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);
30 Console.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
1 class Mascota
2 {
3 publicstring Nombre { get; set; }
4 publicint Edad { get; set; }
5
6 // Constructor
7 publicMascota(string nombreInicial, int edadInicial)
8 {
9 Nombre = nombreInicial;
10 Edad = edadInicial;
11 }
12 }
13
14 class Program
15 {
16 staticvoidMain()
17 {
18 Mascota miGato = newMascota("Michi", 3);
19 Console.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
1 class Libro
2 {
3 publicstring Titulo { get; set; }
4 publicstring Autor { get; set; }
5 }
6
7 // En Main...
8 Libro m = newLibro();
9 m.Titulo = "El Hobbit";
10 m.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
1 class Cuenta
2 {
3 publicint Saldo { get; privateset; }
4 publicvoidDepositar(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
1 class Coche { publicstring Marca { get; set;} }
2
3 // En Main
4 Coche c1 = newCoche();
5 c1.Marca = "Ford";
6 Coche c2 = newCoche();
7 c2.Marca = "Mazda";
8 // Son independientes.
Ponte a prueba
Comprueba tus conocimientos sobre este tema realizando nuestro pequeño test.
C# QuizQuiz: Clases y Objetos
Son 5 preguntas de opción múltiple. ¡Demuestra lo que has aprendido!
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.