Menu
Coddy logo textTech

Repaso de la sobrescritura de métodos

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 33 de 91.

Ya has aprendido sobre la sobrescritura de métodos en el capítulo sobre herencia. Ahora exploremos cómo se relaciona con el polimorfismo, uno de los conceptos más potentes de la programación orientada a objetos.

El polimorfismo significa «muchas formas». Cuando sobrescribes un método en una clase hija, le das a ese método una forma diferente mientras mantienes el mismo nombre. La magia ocurre cuando trabajas con objetos a través de su tipo padre:

<?php
class Animal {
    public function speak() {
        return "Some sound";
    }
}

class Dog extends Animal {
    public function speak() {
        return "Woof!";
    }
}

class Cat extends Animal {
    public function speak() {
        return "Meow!";
    }
}

function makeAnimalSpeak(Animal $animal) {
    return $animal->speak();
}

echo makeAnimalSpeak(new Dog()) . "\n";
echo makeAnimalSpeak(new Cat());

Salida:

Woof!
Meow!

La función makeAnimalSpeak() acepta cualquier Animal. No sabe ni le importa si recibe un Dog o un Cat. PHP llama automáticamente al método sobrescrito correcto según el tipo real del objeto en tiempo de ejecución.

Esto es el polimorfismo en acción.

Este enfoque te permite escribir código flexible que funciona con una familia de objetos relacionados sin conocer sus tipos específicos. Más adelante puedes añadir nuevas clases de animales, y la función funcionará con ellas automáticamente.

Punto clave: La sobrescritura de métodos permite el polimorfismo al permitir que distintas clases respondan de manera diferente a la misma llamada a un método, determinado en tiempo de ejecución por el tipo real del objeto.

challenge icon

Desafío

Fácil

Construyamos un sistema de instrumentos musicales que demuestre el polimorfismo mediante la sobrescritura de métodos. Crearás una clase base Instrument y dos clases hijas que produzcan cada una su propio sonido único; después usarás una sola función para tocar cualquier instrumento de forma polimórfica.

Organizarás tu código en cuatro archivos:

  • Instrument.php: Crea una clase Instrument con una propiedad $name protegida establecida mediante el constructor. Añade un método play() que devuelva "[name] makes a sound". Este será el comportamiento base que las clases hijas sobrescribirán.
  • Guitar.php: Crea una clase Guitar que extienda Instrument. Incluye el archivo padre. El constructor acepta el nombre y se lo pasa al constructor padre. Sobrescribe el método play() para que devuelva "[name] strums a chord".
  • Drum.php: Crea una clase Drum que extienda Instrument. Incluye el archivo padre. El constructor acepta el nombre y se lo pasa al constructor padre. Sobrescribe el método play() para que devuelva "[name] beats a rhythm".
  • main.php: Incluye los archivos de Guitar y Drum. Crea una función llamada performWith que acepte un parámetro Instrument (con declaración de tipo) y devuelva el resultado de llamar a play() en él. Esta función demuestra el polimorfismo. Funciona con cualquier tipo de instrumento mediante la declaración de tipo de la clase padre.

Recibirás dos entradas: un nombre para la guitarra y un nombre para el tambor. Crea un Guitar y un Drum con estos nombres. Pasa cada uno a tu función performWith() e imprime los resultados: primero la guitarra y después el tambor, cada uno en su propia línea.

Observa cómo performWith() acepta cualquier Instrument y, aun así, PHP llama automáticamente al método play() sobrescrito correcto según el tipo real del objeto durante la ejecución. ¡Eso es el polimorfismo en acción!

Pruébalo tú mismo

<?php
// Incluir los archivos de instrumentos
require_once 'Guitar.php';
require_once 'Drum.php';

// Leer la entrada
$guitarName = trim(fgets(STDIN));
$drumName = trim(fgets(STDIN));

// TODO: Crea una función llamada performWith que:
// - Acepta un parámetro Instrument (usa type hint: Instrument $instrument)
// - Devuelve el resultado de llamar a play() en el instrumento

// TODO: Crea un Guitar con $guitarName y un Drum con $drumName
// TODO: Pasa cada uno a performWith() e imprime los resultados (guitar primero, luego drum)

?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de PHP online