Café y Código

10. Los Pilares Definitivos (POO Nivel Empresa)

Herencia de Clases Padre-Hijo

Cuando varias de nuestras Clases tienen datos redundantes (como "PersonajeJugable" y "Enemigo" repitiendo el atributo de `nivel` y el método `moverse()`), creamos una Clase Padre y hacemos que éstas la hereden mediante extends. Así evitamos repetir código, respetando el sagrado principio DRY (Don't Repeat Yourself).

Sub-clases con extends
JAVA
1 // 1. La clase Padre Original
2 class EntidadVisual {
3 public int x = 0;
4 public int y = 0;
5
6 public void borrarDePantalla() {
7 System.out.println("Ocultado desde el Motor.");
8 }
9 }
10
11 // 2. La clase Hija Mágica que se apropia de eso extra e inserta lo suyo
12 class BalaMisil extends EntidadVisual {
13 public int impactoFuego = 100;
14 }
15
16 public class Juego {
17 public static void main(String[] args) {
18 // La bala "ya tiene" acceso a borrarDePantalla() internamente
19 BalaMisil miBala = new BalaMisil();
20 miBala.x = 90;
21 miBala.borrarDePantalla();
22 }
23 }

Las Estrictas Interfaces (Contratos)

Java prohíbe fuertemente la herencia múltiple de clases (no puedes hacer `class X extends A, B`). En su lugar, existen las sagradas Interfaces (interface). Estas solo dictan qué debe hacer una clase, pero no cómo. Dejan que la clase que la implemente usando implements se encargue del dolor de cabeza de rellenar la función.

👨‍💻 Ejercicio Práctico 1

Misión: El polimorfismo musical

Crea clase base `Instrumento` con método protegido void tocar(). Herédala en la clase Guitarra extends Instrumento y usa la anotación protectora @Override arriba del método hijo para reescribir e imprimir "Riff de rock" borrando el sonido anterior del Padre.

👁️ Ver solución propuesta
JAVA
1 class Instrumento {
2 protected void tocar() {
3 System.out.println("Suena instrumento estandar");
4 }
5 }
6
7 class Guitarra extends Instrumento {
8 @Override
9 protected void tocar() {
10 System.out.println("¡Riff de Rock Pesado!");
11 }
12 }
13

👨‍💻 Ejercicio Práctico 2

Misión: Llamar a tus ancestros (Super)

Imagina que el objeto hijo y padre tienen las mismas propiedades. Dentro de un método de la clase Hija, invoca el método original de su padre con la misma firma utilizando super.metodoPadre() para no confundir al compilador.

👁️ Ver solución propuesta
JAVA
1 class EmpleadoBase {
2 void cobrar() { System.out.println("Cobró salario mínimo"); }
3 }
4
5 class Director extends EmpleadoBase {
6 @Override
7 void cobrar() {
8 super.cobrar(); // Realiza lo que hace el padre primero
9 System.out.println("Y cobró super bono empresarial.");
10 }
11 }

👨‍💻 Ejercicio Práctico 3

Misión: Firmando El Contrato Volador

Desarrolla una interfaz estricta llamada IVolador (es costumbre iniciar con 'I') exigiendo que cualquiera que lo use tenga el método void volar();. Haz que una clase Pato implemente la interfaz y le de poder real usando implements IVolador.

👁️ Ver solución propuesta
JAVA
1 interface IVolador {
2 // Vacío y abstracto obligatoriamente
3 void volar();
4 }
5
6 class Pato implements IVolador {
7 @Override
8 public void volar() {
9 System.out.println("El pato despliega sus alas.");
10 }
11 }

👨‍💻 Ejercicio Práctico 4

Misión: Abstracciones Inconclusas

Conoce las clases Extractas. Si añades public abstract class X a la declaración, jamás podrás hacer sus objetos directo con 'new'. Simula este escenario bloqueando que alguien instancie a 'SerVivo'.

👁️ Ver solución propuesta
JAVA
1 public abstract class SerVivo {
2 public int pulsaciones;
3 }
4
5 // Generaría ERROR de seguridad instanciar SerVivo s = new SerVivo();
6 // pero SÍ te permite usarla como padre en el archivo de un 'Perro'.

Ponte a prueba

Termina invicto la lección teórica sobre Herencias y Contratos formales.

Dato curioso: JDK 1.0 en 1996; James Gosling y Sun Microsystems. Wikipedia

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