Menu
Coddy logo textTech

Abstrakte Klassen

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 25 von 91.

Eine abstrakte Klasse ist eine Klasse, die nicht direkt instanziiert werden kann. Sie dient als Vorlage für andere Klassen und definiert Methoden, die Kindklassen implementieren müssen. Du erstellst eine abstrakte Klasse mit dem Schlüsselwort 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();

Ausgabe:

15

Die Klasse Shape deklariert eine abstrakte Methode calculateArea(), ohne eine Implementierung bereitzustellen. Jede Klasse, die Shape erweitert, muss diese Methode implementieren. Beachte, dass abstrakte Klassen auch reguläre Methoden wie getColor() enthalten können, die Kindklassen direkt erben.

Abstrakte Methoden legen fest, was eine Kindklasse tun muss, aber nicht wie. Dadurch wird sichergestellt, dass alle Formen über eine calculateArea()-Methode verfügen, während jede Form ihre Fläche auf unterschiedliche Weise berechnen kann.

Wichtiger Punkt: Abstrakte Klassen verbinden die Struktur der Vererbung mit verbindlichen Anforderungen. Verwende sie, wenn du Code unter verwandten Klassen teilen und gleichzeitig sicherstellen möchtest, dass bestimmte Methoden von jeder untergeordneten Klasse implementiert werden.

challenge icon

Aufgabe

Einfach

Lass uns ein Mediaplayer-System erstellen, das zeigt, wie abstrakte Klassen einen Vertrag erzwingen und gleichzeitig verschiedenen Medientypen ermöglichen, ihr eigenes Wiedergabeverhalten zu implementieren.

Du wirst deinen Code auf drei Dateien verteilen:

  • Media.php: Definiere eine abstrakte Media-Klasse, die als Vorlage für alle Medientypen dient. Sie sollte eine geschützte Eigenschaft $title und einen Konstruktor besitzen, der den Titel entgegennimmt und festlegt. Füge eine abstrakte Methode namens play() hinzu, die Kindklassen implementieren müssen. Füge außerdem eine reguläre Methode getTitle() hinzu, die den Titel zurückgibt. Diese konkrete Methode wird von allen Kindklassen geerbt.
  • Song.php: Definiere eine Song-Klasse, die Media erweitert. Binde die Media-Datei am Anfang ein. Diese Klasse fügt eine Eigenschaft $artist hinzu. Der Konstruktor sollte Titel und Künstler entgegenehmen: Verwende parent::__construct() für den Titel und lege anschließend den Künstler selbst fest. Implementiere die erforderliche Methode play(), die "Playing song: [title] by [artist]" zurückgibt.
  • Podcast.php: Definiere eine Podcast-Klasse, die Media erweitert. Binde die Media-Datei am Anfang ein. Diese Klasse fügt eine Eigenschaft $episode hinzu (eine Ganzzahl). Der Konstruktor sollte Titel und Episodennummer entgegenehmen: Verwende parent::__construct() für den Titel und lege anschließend die Episode fest. Implementiere die erforderliche Methode play(), die "Playing podcast: [title] - Episode [episode]" zurückgibt.

Binde in main.php sowohl die Song- als auch die Podcast-Datei ein. Du erhältst vier Eingaben: den Songtitel, den Namen des Künstlers, den Podcasttitel und die Episodennummer (als Zeichenfolge, die in eine Ganzzahl umgewandelt werden soll). Erstelle mit diesen Werten ein Song- und ein Podcast-Objekt. Gib zuerst das Ergebnis des Aufrufs von play() für den Song und anschließend für den Podcast aus, jeweils in einer eigenen Zeile.

Diese Aufgabe zeigt, wie abstrakte Klassen einen Vertrag definieren: Jeder Medientyp muss eine play()-Methode besitzen, aber jeder Typ implementiert sie unterschiedlich. Die abstrakte Media-Klasse kann nicht direkt instanziiert werden; sie existiert nur, um ihren Kindklassen Struktur und gemeinsame Funktionalität bereitzustellen.

Probier es selbst

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

// Eingaben lesen
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));

// TODO: Erstelle ein Song-Objekt mit songTitle und artistName

// TODO: Erstelle ein Podcast-Objekt mit podcastTitle und episodeNumber

// TODO: Gib das Ergebnis des Aufrufs von play() auf dem Song aus

// TODO: Gib das Ergebnis des Aufrufs von play() auf dem Podcast aus

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-PHP-Compiler