Die Pferde sind eine interessante Klassenhierarchie mit praktischen Methoden.
Die abstrakte Klasse "Pferd" erbt direkt von "Unpaarhufer", und diese wiederum von "Säugetier". (In Java wird "Säugetier" zusätzlich von "Object" abgeleitet.)
Unser "Hauspferd" ist wiederum eine Ableitung von "Pferd" und dient wiederum als Superklasse verschiedener Pferde-"Rassen", deren Instanzen in der Collection-Klasse "Equidae" gesammelt werden können.
Gegenstück zum Hauspferd sind verschiedene Wildpferdklassen, die für Reitapplikationen idR aber nicht zum Einsatz kommen.
Manche dieser Subklassen implementieren das "Warmblut"-, andere das "Kaltblut"- und wieder andere das "Vollblut"-Interface. Außerdem gibt es so genannte Reitweise-Interfaces, nämlich "Reiten" (neuerdings in manchen Frameworks richtiger als "Klassisch" oder "Englisch" bezeichnet), "Western" (Neuadaption aus dem US-Westen, eher pragmatisch konzipiert) sowie weniger verbreitete Reitweise-Interfaces wie "Rai" oder "Barock".
Die beliebtesten Methoden der Pferdeklassen sind schritt(), trab() und galopp(). Bei der Verwendung ist besonders darauf zu achten, dass der durch fehlerhafte Parameterwahl entstehende "Kreuzgalopp" vermieden wird, denn das Pferd wirft in einem solchen Fall keine Exception!
Ähnlich der sogenannte Passgang, der in allen Ableitungen, die nicht explizit das Passgang-Interface implementieren (wodurch eine Methode pass() vorgeschrieben wird; zB beim IsländerPferd), als fehlerhafter Algorithmus zu werten ist, aber dennoch keine Exception wirft. Achtung: Wird bei einem normalen Wettbewerb eine explizite oder implizite Verwendung der Passgang-Methode festgestellt, so wird der Teilnehmer disqualifiziert.
Exceptions werden allerdings schon geworfen bei diversen ungültigen Aufrufen der Gangmethoden. Beispiel:
$p = new QuarterHorse();
[...] // Putzen, Satteln
$p->aufsteigen(new Reiter());
$p->beinAufheben($p::LINKS_VORNE);
$p->beinAufheben($p::RECHTS_HINTEN);
$p->schritt();
Dieser Vorgang wirft eine Pferd:SturzAufsMaulException. Zusätzlich sollte die Pferd::ReiterFälltException bei allen Gangmethodenaufrufen abgefangen werden. Ein Beispiel dafür (vereinfacht):
$p = new QuarterHorse();
// Putzen, Satteln
try
{
$p->galopp();
}
catch(ReiterFälltException $e)
{
$p->whoa();
$p->aufsteigen($e->getReiter());
}
Anmerkung: Die whoa-Methode (aus dem Western-Interface) kann bei Pferden mit anderen Reitweisemethoden verschiedene andere Namen haben, zB "brr" oder "sch".
Bei der Implementierung von Pferdklassen ist ein verbreiteter Fehler zu vermeiden:
FALSCH:
class MeinPferd extends HausPferd implements Western
{
public function galopp($schenkelPos=false, $zuegelPos=false, $stimme=false)
{
if($this->unueberwindbar($this->nextHindernis) || $this->hasPanik())
{
throw $this->reiter;
}
}
}
RICHTIG muss es heißen:
throw new ReiterFälltException($this->reiter);
In den nächsten Folgen gehen wir auf weitere Themen ein:
Folge 2 - Zaumzeug und Sattel: Die Steuerungsschnittstelle ausprogrammieren
Folge 3 - Wettbewerbe. Pferdecoden nach Styleguide und mit Performancevorgaben
Folge 4 - Die Stute als zentraler Bestandteil des Factory-Patterns
Folge 5 - Abarbeitung eines Hindernisstreams - Die Prozesskette aus Reitersicht