Café y Código

9. POO Básico (Clases y Objetos)

El paradigma de Programación Orientada a Objetos

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)
5 public string nombre;
6 public string raza;
7
8 // Su comportamiento (métodos)
9 public void Ladrar()
10 {
11 Console.WriteLine($"Soy {nombre} y hago: ¡Guau!");
12 }
13}
14
15class Program
16{
17 static void Main()
18 {
19 // Creamos un nuevo objeto Perro desde el molde
20 Perro miPerro = new Perro();
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{
3 public string nombre;
4
5 // Nuestro Constructor: Se ejecuta mágicamente al hacer 'new'
6 public Perro(string nombreInicial)
7 {
8 nombre = nombreInicial;
9 }
10}
11
12class Program
13{
14 static void Main()
15 {
16 // Ya nace con nombre desde el inicio
17 Perro miPerro = new Perro("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
1class Personaje
2{
3 // Propiedad con 'get' (solo lectura desde afuera)
4 // y 'set' (asigna el dato desde adentro)
5 public int Vida { get; private set; }
6
7 public Personaje()
8 {
9 Vida = 100; // Inicia con vida plena
10 }
11
12 public void RecibirDano(int cantidad)
13 {
14 Vida -= cantidad;
15 }
16}
17
18class Program
19{
20 static void Main()
21 {
22 Personaje hero = new Personaje();
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
CSHARP
1class Mascota
2{
3 public string Nombre { get; set; }
4 public int Edad { get; set; }
5
6 // Constructor
7 public Mascota(string nombreInicial, int edadInicial)
8 {
9 Nombre = nombreInicial;
10 Edad = edadInicial;
11 }
12}
13
14class Program
15{
16 static void Main()
17 {
18 Mascota miGato = new Mascota("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
CSHARP
1class Libro
2{
3 public string Titulo { get; set; }
4 public string Autor { get; set; }
5}
6
7// En Main...
8Libro m = new Libro();
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
CSHARP
1class Cuenta
2{
3 public int Saldo { get; private set; }
4 public void Depositar(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
CSHARP
1class Coche { public string Marca { get; set;} }
2
3// En Main
4Coche c1 = new Coche();
5c1.Marca = "Ford";
6Coche c2 = new Coche();
7c2.Marca = "Mazda";
8// Son independientes.

Ponte a prueba

Comprueba tus conocimientos sobre este tema realizando nuestro pequeño test.

Dato curioso: Microsoft lo presentó en 2000; C# 1.0 con .NET en 2002 (Anders Hejlsberg). Wikipedia

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.