Menu
Coddy logo textTech

Classes Abstratas

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

Uma classe abstrata é uma classe que não pode ser instanciada diretamente. Ela serve como um modelo para outras classes, definindo métodos que as classes filhas devem implementar. Você cria uma classe abstrata usando a palavra-chave abstract.

<?php
abstract class Shape {
    protected $color;
    
    public function __construct($color) {
        $this->color = $color;
    }
    
    abstract public function calculateArea();
    
    public function getColor() {
        return $this->color;
    }
}

class Rectangle extends Shape {
    private $width;
    private $height;
    
    public function __construct($color, $width, $height) {
        parent::__construct($color);
        $this->width = $width;
        $this->height = $height;
    }
    
    public function calculateArea() {
        return $this->width * $this->height;
    }
}

$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();

Saída:

15

A classe Shape declara um método abstrato calculateArea() sem fornecer uma implementação. Qualquer classe que estenda Shape deve implementar esse método. Observe que classes abstratas também podem conter métodos regulares, como getColor(), que as classes filhas herdam diretamente.

Métodos abstratos definem o que uma classe filha deve fazer, mas não como. Isso garante que todas as formas tenham um método calculateArea(), permitindo que cada forma calcule sua área de maneira diferente.

Ponto-chave: Classes abstratas combinam a estrutura da herança com requisitos obrigatórios. Use-as quando quiser compartilhar código entre classes relacionadas, garantindo que determinados métodos sejam implementados por cada classe filha.

challenge icon

Desafio

Fácil

Vamos criar um sistema de reprodutor de mídia que demonstra como classes abstratas impõem um contrato e, ao mesmo tempo, permitem que diferentes tipos de mídia implementem seu próprio comportamento de reprodução.

Você organizará seu código em três arquivos:

  • Media.php: Defina uma classe abstrata Media que sirva como modelo para todos os tipos de mídia. Ela deve ter uma propriedade protegida $title e um construtor que aceite e defina o título. Inclua um método abstrato chamado play() que as classes filhas deverão implementar. Adicione também um método comum getTitle() que retorne o título. Esse método concreto será herdado por todas as classes filhas.
  • Song.php: Defina uma classe Song que estenda Media. Inclua o arquivo Media no início. Essa classe adiciona uma propriedade $artist. O construtor deve aceitar o título e o artista: use parent::__construct() para o título e, em seguida, defina o artista. Implemente o método obrigatório play() para retornar "Playing song: [title] by [artist]".
  • Podcast.php: Defina uma classe Podcast que estenda Media. Inclua o arquivo Media no início. Essa classe adiciona uma propriedade $episode (um inteiro). O construtor deve aceitar o título e o número do episódio: use parent::__construct() para o título e, em seguida, defina o episódio. Implemente o método obrigatório play() para retornar "Playing podcast: [title] - Episode [episode]".

Em main.php, inclua os arquivos Song e Podcast. Você receberá quatro entradas: o título da música, o nome do artista, o título do podcast e o número do episódio (como uma string a ser convertida em um inteiro). Crie um objeto Song e um objeto Podcast com esses valores. Imprima primeiro o resultado da chamada de play() na música e, depois, no podcast, cada um em sua própria linha.

Este desafio mostra como classes abstratas definem um contrato: todo tipo de mídia deve ter um método play(), mas cada tipo o implementa de maneira diferente. A classe abstrata Media não pode ser instanciada diretamente; ela existe apenas para fornecer estrutura e funcionalidades compartilhadas às suas classes filhas.

Experimente você mesmo

<?php
require_once 'Song.php';
require_once 'Podcast.php';

// Ler entradas
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));

// TODO: Criar um objeto Song com songTitle e artistName

// TODO: Criar um objeto Podcast com podcastTitle e episodeNumber

// TODO: Imprimir o resultado de chamar play() na song

// TODO: Imprimir o resultado de chamar play() no podcast

?>
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