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:
15Die 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.
Aufgabe
EinfachLassen 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 KlasseMedia, die als Vorlage für alle Medientypen dient. Sie sollte eine geschützte Eigenschaft$titleund einen Konstruktor haben, der den Titel entgegennimmt und setzt. Fügen Sie eine abstrakte Methode namensplay()hinzu, die Kindklassen implementieren müssen. Fügen Sie außerdem eine reguläre MethodegetTitle()hinzu, die den Titel zurückgibt — diese konkrete Methode wird von allen Kindklassen geerbt.Song.php— Definieren Sie eine KlasseSong, dieMediaerweitert. Binden Sie die Media-Datei oben ein. Diese Klasse fügt eine Eigenschaft$artisthinzu. Der Konstruktor sollte Titel und Künstler entgegennehmen — verwenden Sieparent::__construct()für den Titel und setzen Sie den Künstler dann selbst. Implementieren Sie die erforderliche Methodeplay(), um"Playing song: [title] by [artist]"zurückzugeben.Podcast.php— Definieren Sie eine KlassePodcast, dieMediaerweitert. 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 Sieparent::__construct()für den Titel und setzen Sie dann die Episode. Implementieren Sie die erforderliche Methodeplay(), 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
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung