Menu
Coddy logo textTech

Revisão da Sobrescrita de Métodos

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 33 de 91.

Você já aprendeu sobre sobrescrita de métodos no capítulo sobre herança. Agora vamos explorar como ela se conecta ao polimorfismo — um dos conceitos mais poderosos da programação orientada a objetos.

Polimorfismo significa “muitas formas”. Quando você sobrescreve um método em uma classe filha, está dando a esse método uma forma diferente, mantendo o mesmo nome. A mágica acontece quando você trabalha com objetos por meio de seu tipo pai:

<?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());

Saída:

Woof!
Meow!

A function makeAnimalSpeak() accepts qualquer Animal. Ela não sabe nem se importa se recebe um Dog ou Cat. O PHP chama automaticamente o método sobrescrito correto com base no tipo real do objeto em tempo de execução.

Isso é o polimorfismo em ação.

Essa abordagem permite escrever um código flexível que funciona com uma família de objetos relacionados sem conhecer seus tipos específicos. Você pode adicionar novas classes de animais posteriormente, e a função funcionará com elas automaticamente.

Ponto-chave: A sobrescrita de métodos possibilita o polimorfismo ao permitir que diferentes classes respondam de maneira diferente à mesma chamada de método, determinada em tempo de execução pelo tipo real do objeto.

challenge icon

Desafio

Fácil

Vamos criar um sistema de instrumentos musicais que demonstra polimorfismo por meio da sobrescrita de métodos. Você criará uma classe base Instrument e duas classes filhas, cada uma produzindo seu próprio som exclusivo; em seguida, usará uma única função para tocar qualquer instrumento de forma polimórfica.

Você organizará seu código em quatro arquivos:

  • Instrument.php: crie uma classe Instrument com uma propriedade $name protegida, definida por meio do construtor. Adicione um método play() que retorne "[name] makes a sound". Esse será o comportamento base que as classes filhas sobrescreverão.
  • Guitar.php: crie uma classe Guitar que estenda Instrument. Inclua o arquivo pai. O construtor aceita o nome e o passa para o construtor pai. Sobrescreva o método play() para retornar "[name] strums a chord".
  • Drum.php: crie uma classe Drum que estenda Instrument. Inclua o arquivo pai. O construtor aceita o nome e o passa para o construtor pai. Sobrescreva o método play() para retornar "[name] beats a rhythm".
  • main.php: inclua os arquivos Guitar e Drum. Crie uma função chamada performWith que aceite um parâmetro Instrument (com declaração de tipo) e retorne o resultado da chamada de play() nele. Essa função demonstra o polimorfismo. Ela funciona com qualquer tipo de instrumento por meio da declaração de tipo da classe pai.

Você receberá duas entradas: um nome para a guitarra e um nome para o tambor. Crie um Guitar e um Drum com esses nomes. Passe cada um para sua função performWith() e imprima os resultados: primeiro a guitarra e depois o tambor, cada um em sua própria linha.

Observe como performWith() aceita qualquer Instrument, mas o PHP chama automaticamente o método play() sobrescrito correto com base no tipo real do objeto em tempo de execução. Isso é o polimorfismo em ação!

Experimente você mesmo

<?php
// Inclua os arquivos dos instrumentos
require_once 'Guitar.php';
require_once 'Drum.php';

// Leia a entrada
$guitarName = trim(fgets(STDIN));
$drumName = trim(fgets(STDIN));

// TODO: Crie uma função chamada performWith que:
// - Aceita um parâmetro Instrument (use type hint: Instrument $instrument)
// - Retorna o resultado de chamar play() no instrumento

// TODO: Crie um Guitar com $guitarName e um Drum com $drumName
// TODO: Passe cada um para performWith() e imprima os resultados (guitar primeiro, depois drum)

?>
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de PHP online