Café y Código

10. Los Pilares de la POO

¿A dónde vamos con todo esto?

Ya conoces la Abstracción y el Encapsulamiento (get / set). Ahora nos enfocaremos en Herencia y Polimorfismo. Estos pilares te permitirán escribir enormes simulaciones, videojuegos o aplicaciones reduciendo el código repetido casi a cero.

Herencia (`:`)

La herencia significa crear una "clase hija" que obtiene todas las propiedades y métodos de una "clase padre", logrando así reutilizar el comportamiento base sin tener que escribirlo de nuevo.

Herencia en Acción
CSHARP
1 // Clase Padre General (Base)
2 class Animal
3 {
4 public string Nombre { get; set; }
5
6 public void Respirar()
7 {
8 Console.WriteLine("Respirando...");
9 }
10 }
11
12 // Gato *es un* Animal (Clase hija o Derivada)
13 class Gato : Animal
14 {
15 public void Maullar()
16 {
17 Console.WriteLine("¡Miau!");
18 }
19 }
20
21 class Program
22 {
23 static void Main()
24 {
25 Gato miGatito = new Gato();
26
27 miGatito.Nombre = "Michi"; // Propiedad heredada de Animal
28 miGatito.Respirar(); // Método heredado de Animal
29
30 miGatito.Maullar(); // Su propio método
31 }
32 }

Polimorfismo (`virtual` y `override`)

Ocurre cuando heredaste de la clase base un método, pero te das cuenta que es deficiente, así que la hija decide sobrescribirlo (rediseñarlo por su cuenta), logrando tener "múltiples formas" de ejecución bajo el mismo nombre.

Polimorfismo (Sobrescritura)
CSHARP
1 // Clase Base
2 class Enemigo
3 {
4 // 'virtual' significa: "Las hijas pueden modificar este botón"
5 public virtual void Atacar()
6 {
7 Console.WriteLine("El enemigo da un golpe simple: -10 HP");
8 }
9 }
10
11 class JefeFinal : Enemigo
12 {
13 // 'override' significa: "Lo siento papá, yo lo haré a mi manera"
14 public override void Atacar()
15 {
16 Console.WriteLine("El JEFE LANZA FUEGO: -100 HP y quema todo");
17 }
18 }

Interfaces (`I`)

Las Interfaces en C# son como contratos. Las llamas empezando con I obligan a una clase a decir: "Yo prometo firmar el contrato e implementar estos métodos". Es clave en arquitecturas de dependencias, y aunque no permite variables, dictará el comportamiento exacto que deba ser seguido.

Sintaxis de Interfaces
CSHARP
1 // Es como un contrato que dice "quien use esto DEBE poder VOLAR"
2 interface IVolador
3 {
4 void Volar();
5 }
6
7 // Un avión implementa el contrato
8 class Avion : IVolador
9 {
10 public void Volar()
11 {
12 Console.WriteLine("Motores encendidos. Volando por el cielo.");
13 }
14 }
15
16 // Un pato también
17 class Pato : IVolador
18 {
19 public void Volar()
20 {
21 Console.WriteLine("El pato mueve las alas.");
22 }
23 }

¡Felicidades, has dominado los fundamentos de C#! 🎉

Desde escribir tu primer programa secuencial, evaluar lógicas con ciclos, agrupar datos, hasta aplicar buenas prácticas de ingeniería de software mediante Clases e Interfaces. Estás completamente capacitado para saltar a un Framework moderno (`ASP.NET Core`, `Unity`, `React con C# backend`) o afrontar nuestra sección del "Modo Desafío".

👨‍💻 Ejercicio Práctico

Misión: Herencia Heroica

Crea una clase base Personaje con un método virtual Atacar(). Luego, crea una clase hija Guerrero : Personaje que le haga override al ataque para hacerlo más fuerte.

👁️ Ver solución propuesta
CSHARP
1 class Personaje
2 {
3 public virtual void Atacar()
4 {
5 Console.WriteLine("Daño básico de 10 puntos.");
6 }
7 }
8
9 class Guerrero : Personaje
10 {
11 public override void Atacar()
12 {
13 Console.WriteLine("¡Golpe Aplastante! Daño de 50 puntos.");
14 }
15 }
16
17 class Program
18 {
19 static void Main()
20 {
21 Guerrero g = new Guerrero();
22 g.Atacar(); // Imprime el golpe del Guerrero
23 }
24 }

👨‍💻 Ejercicio Práctico 2

Misión: El polimorfismo musical

Crea clase base `Instrumento` con método virtual Tocar(). Herédala en Guitarra y hazle un override diciendo "¡Riff de Rock!".

👁️ Ver solución propuesta
CSHARP
1 class Instrumento
2 {
3 public virtual void Tocar() { Console.WriteLine("Suena algo"); }
4 }
5
6 class Guitarra : Instrumento
7 {
8 public override void Tocar() { Console.WriteLine("¡Riff de Rock!"); }
9 }

👨‍💻 Ejercicio Práctico 3

Misión: Contrato Volador

Desarrolla una interfaz IVolador con el método Volar(). Haz que una clase Pato implemente la interfaz.

👁️ Ver solución propuesta
CSHARP
1 interface IVolador
2 {
3 void Volar();
4 }
5
6 class Pato : IVolador
7 {
8 public void Volar() {
9 Console.WriteLine("El pato vuela");
10 }
11 }

👨‍💻 Ejercicio Práctico 4

Misión: Herencia de Propiedades

Una clase Vehiculo con propiedad `Llantas`. La clase Moto hereda de ella. En Main crea tu moto y asígnale `m.Llantas = 2`.

👁️ Ver solución propuesta
CSHARP
1 class Vehiculo
2 {
3 public int Llantas { get; set; }
4 }
5
6 class Moto : Vehiculo { }
7
8 // En Main
9 Moto m = new Moto();
10 m.Llantas = 2;

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.