Objektorientierte Programme werden durch eine hierarchische Struktur von Klassen erstellt. In Einzelvererbungssprachen wie PHP erfolgt die Klassenvererbung baumartig. Eine Stammklasse hat eine oder mehrere Unterklassen, und dann werden von jeder Unterklasse eine oder mehrere Unterklassen geerbt . Weitere Unterkategorien der nächsten Ebene. Natürlich können mehrere Stammklassen zur Implementierung unterschiedlicher Funktionen verwendet werden. In einer gut gestalteten Architektur sollte jede Stammklasse über eine nützliche Schnittstelle verfügen, die vom Anwendungscode verwendet werden kann. Wenn unser Anwendungscode für die Arbeit mit der Stammklasse konzipiert ist, kann er auch mit jeder Unterklasse funktionieren, die von der Stammklasse erbt.
Eine abstrakte Methode ist wie ein Platzhalter für eine reguläre Methode in einer Unterklasse (sie nimmt Platz ein, hat aber keine Wirkung), verfügt aber im Gegensatz zu einer regulären Methode über keinen Code. Wenn eine Klasse eine oder mehrere abstrakte Methoden enthält, wird die Klasse zu einer abstrakten Klasse. Sie können keine abstrakten Klassen instanziieren. Sie müssen von ihnen erben und dann Unterklassen instanziieren. Sie können sich abstrakte Klassen auch als Vorlage für Unterklassen vorstellen.
Wenn Sie alle abstrakten Methoden überschreiben, wird die Unterklasse zu einer normalen Klasse. Wenn nicht alle Methoden überschrieben werden, ist die Unterklasse immer noch abstrakt. Wenn eine Klasse eine abstrakte Methode enthält (auch wenn es nur eine gibt), müssen Sie die Klasse als abstrakt deklarieren, indem Sie vor dem Schlüsselwort class hinzufügen.
Die Syntax der Deklaration einer abstrakten Methode unterscheidet sich von der Syntax der Deklaration einer allgemeinen Methode. Bei der abstrakten Methode steht der Hauptteil nicht wie bei der allgemeinen Methode in geschweiften Klammern und endet mit einem Semikolon.
In Beispiel 6.13 definieren wir eine Klasse Shape, die eine getArea-Methode enthält. Da es jedoch unmöglich ist, die Fläche der Figur zu bestimmen, ohne die Form zu kennen, haben wir die Methode getArea als abstrakte Methode deklariert. Sie können ein Shape-Objekt nicht instanziieren, aber Sie können von ihm erben oder es in einem Ausdruck verwenden, wie in Beispiel 6.13.
Wenn Sie eine Klasse nur mit abstrakten Methoden erstellen, definieren Sie eine Schnittstelle. Um diese Situation zu veranschaulichen, verfügt PHP über die Schnittstelle und implementiert Schlüsselwörter. Sie können eine Schnittstelle anstelle von abstrakten Klassen und Implementierungen anstelle von Erweiterungen verwenden, um Ihre Klassendefinition zu beschreiben. Sie können beispielsweise eine myClass-Implementierung von myIterface verwenden. Sie können je nach persönlichen Vorlieben zwischen diesen beiden Methoden wählen.
/*Notiz:
Die beiden Methoden beziehen sich auf:
1. abstrakte Klasse aaa{} (Beachten Sie, dass es in aaa nur abstrakte Methoden gibt, keine allgemeinen Methoden)
Klasse bbb erweitert aaa{} (überschreibt die abstrakte Methode in aaa in bbb)
2. Schnittstelle aaa{}
Klasse bbb implementiert aaa{} (überschreibt die abstrakte Methode in aaa in bbb)
*/
Listing 6.13 Abstrakte Klassen
//abstrakte Stammklasse abstrakte Stammklasse
abstrakte Klasse Shape
{
abstrakte Funktion getArea(); //Definieren Sie eine abstrakte Methode
}
//abstrakte untergeordnete Klasse, abstrakte Unterklasse
abstrakte Klasse Polygon erweitert Shape //Polygon
{
abstrakte Funktion getNumberOfSides();
}
// Konkrete Klasse, Entitätsklasse, Dreiecksklasse
Die Klasse Triangle erweitert Polygon
{
öffentliche $base;
public $height;
public function getArea() //Überschreiben Sie die Flächenberechnungsmethode{
return(($this->base * $this->height)/2);
}
öffentliche Funktion getNumberOfSides() //Seitenzählmethode überschreiben{
return(3);
}
}
//Konkrete Klasse Entitätsklasse Viereck
Die Klasse „Rechteck“ erweitert das Polygon
{
öffentliche $width;
öffentliche $height;
öffentliche Funktion getArea()
{
return($this->width * $this->height);
}
öffentliche Funktion getNumberOfSides()
{
return(4);
}
}
// Konkreter Klassenentitätsklassenkreis
Klasse Circle erweitert Shape
{
öffentliche $radius;
öffentliche Funktion getArea()
{
return(pi() * $this->radius * $this->radius);
}
}
// Die Betonstammklasse definiert eine Farbklasse
classColor
{
öffentlicher $name;
}
$myCollection = array(); //Eine Sammlung von Formen erstellen und in ein Array einfügen
//ein Rechteck erstellen
$r = neues Rechteck;
$r->width = 5;
$r->height = 7;
$myCollection[] = $r;
unset($r);
//erstelle ein Dreieck
$t = neues Dreieck;
$t->base = 4;
$t->height = 5;
$myCollection[] = $t;
unset($t);
//einen Kreis bilden
$c = neuer Kreis;
$c->radius = 3;
$myCollection[] = $c;
unset($c);
//eine Farbe erstellen
$c = neue Farbe;
$c->name = "blau";
$myCollection[] = $c;
unset($c);
foreach($myCollection as $s)
{
if($s Instanz von Shape) //Wenn $s eine Instanz der Shape-Klasse ist{
print("Bereich: " . $s->getArea() . "n");
}
if($s Instanz von Polygon)
{
print("Sides: " .$s->getNumberOfSides()."n");
}
if($s Instanz von Color)
{
print("Farbe: $s->name n");
}
print("n");
}
?>