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 Bauplan für andere Klassen und definiert Methoden, die Kindklassen implementieren müssen. Sie erstellen 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. Beachten Sie, dass abstrakte Klassen auch reguläre Methoden wie getColor() enthalten können, die Kindklassen direkt erben.

Abstrakte Methoden definieren, was eine Kindklasse tun muss, aber nicht wie. Dies stellt sicher, dass alle Formen eine calculateArea()-Methode haben, während jede Form ihren Flächeninhalt unterschiedlich berechnen kann.

Wichtiger Punkt: Abstrakte Klassen kombinieren die Struktur der Vererbung mit erzwungenen Anforderungen. Verwenden Sie diese, wenn Sie Code zwischen verwandten Klassen teilen möchten, während Sie gleichzeitig sicherstellen, dass bestimmte Methoden von jeder Kindklasse implementiert werden.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Mediaplayer-System bauen, das demonstriert, wie abstrakte Klassen einen Vertrag erzwingen und gleichzeitig verschiedenen Medientypen ermöglichen, ihr eigenes Wiedergabeverhalten zu implementieren.

Sie werden Ihren Code über drei Dateien organisieren:

  • Media.php — Definieren Sie eine abstrakte Klasse Media, die als Vorlage für alle Medientypen dient. Sie sollte eine geschützte Eigenschaft $title und einen Konstruktor haben, der den Titel entgegennimmt und setzt. Fügen Sie eine abstrakte Methode namens play() hinzu, die Kindklassen implementieren müssen. Fügen Sie außerdem eine reguläre Methode getTitle() hinzu, die den Titel zurückgibt — diese konkrete Methode wird von allen Kindklassen geerbt.
  • Song.php — Definieren Sie eine Klasse Song, die Media erweitert. Binden Sie die Media-Datei oben ein. Diese Klasse fügt eine Eigenschaft $artist hinzu. Der Konstruktor sollte Titel und Künstler entgegennehmen — verwenden Sie parent::__construct() für den Titel und setzen Sie den Künstler dann selbst. Implementieren Sie die erforderliche Methode play(), um "Playing song: [title] by [artist]" zurückzugeben.
  • Podcast.php — Definieren Sie eine Klasse Podcast, die Media erweitert. Binden Sie die Media-Datei oben ein. Diese Klasse fügt eine Eigenschaft $episode (eine Ganzzahl) hinzu. Der Konstruktor sollte Titel und Episodennummer entgegennehmen — verwenden Sie parent::__construct() für den Titel und setzen Sie dann die Episode. Implementieren Sie die erforderliche Methode play(), um "Playing podcast: [title] - Episode [episode]" zurückzugeben.

In main.php binden Sie sowohl die Song- als auch die Podcast-Dateien ein. Sie erhalten vier Eingaben: den Songtitel, den Künstlernamen, den Podcasttitel und die Episodennummer (als String, der in eine Ganzzahl umgewandelt werden muss). Erstellen Sie ein Song- und ein Podcast-Objekt mit diesen Werten. Geben Sie das Ergebnis des Aufrufs von play() zuerst für den Song und dann für den Podcast aus, jeweils in einer eigenen Zeile.

Diese Herausforderung zeigt, wie abstrakte Klassen einen Vertrag definieren — jeder Medientyp muss eine play()-Methode haben, aber jeder Typ implementiert sie anders. Die abstrakte Klasse Media kann nicht direkt instanziiert werden; sie existiert nur, um Struktur und gemeinsame Funktionalität für ihre Kinder bereitzustellen.

Spickzettel

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. Verwenden Sie das Schlüsselwort abstract, um eine abstrakte Klasse zu erstellen.

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

Kindklassen müssen alle abstrakten Methoden implementieren:

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;
    }
}

Wesentliche Merkmale:

  • Abstrakte Klassen können nicht direkt instanziiert werden
  • Abstrakte Methoden haben keine Implementierung in der abstrakten Klasse
  • Kindklassen müssen alle abstrakten Methoden implementieren
  • Abstrakte Klassen können sowohl abstrakte als auch reguläre Methoden enthalten
  • Reguläre Methoden in abstrakten Klassen werden von Kindklassen geerbt

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: Erstellen Sie ein Song-Objekt mit songTitle und artistName

// TODO: Erstellen Sie ein Podcast-Objekt mit podcastTitle und episodeNumber

// TODO: Geben Sie das Ergebnis des Aufrufs von play() für den Song aus

// TODO: Geben Sie das Ergebnis des Aufrufs von play() für den 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