Hallo liebe Community!
Dies ist mein erstes Tutorial also seit nicht zu streng mit der Kritik, über Verbesserungsvorschläge würde ich mich dennoch freuen!
Ich setze voraus, dass man weiß wie Funktionen geschrieben werden und dass man mit Variablen umgehen kann. Außerdem sollte man folgende Parts meines Tutorials gelesen haben:
Dieser Part behandelt die Vererbung nochmal genauer.
Hier der Quellcode den ich in diesem Part besprechen will. Er setzt sich aus dem Quellcode von Part 4, dem Wissen aus Part 5 und dem neuen aus diesem Part zusammen:
Alles anzeigen
Das neue findet sich gleich in der 1.Zeile. Das keyword abstract (abstrakt). Wird eine Klasse als abstact definiert, so kann man keine Instanz dieser Klasse (also kein Objekt der Klasse) erzeugen. Man kann auch Methoden als abstract definieren, jedoch MUSS eine Klasse, sobald sie auch nur eine einzige abstakte Methode hat, auch abstrakt sein.
Jetzt auf unsere Raumschiffe bezogen: es sollte NIE das Raumschiff "Raumschiff" geben, das ist ja nur der Prototyp für alle anderen Raumschiffe, deswegen muss diese Klasse abstract sein! Jetzt zu den abstract methods:
Alles anzeigen
Wer möchte kann den Code mal ohne die Funktionsdefinition in der Klasse Jaeger laufen lassen. Das wird Fehler erzeugen! Einer abstrakten Methode wird kein Quellcode zugeordnet. Sie hat nur eine Funktion: die Kindklasse dazu "zwingen", eine Methode mit dem selben Namen und mit den selben Parametern (die Parameter dürfen sich nicht in Anzahl oder Namen unterscheiden) zu definieren. Dabei ist zu beachten das es nur strengere Sichtbarkeiten gibt. Also wenn man protected angegeben hat muss die Funktion nachher protected oder private sein.
Das abstract keyword wird mit PHP 5 eingeführt und ist voher nicht verfügbar!
Im nächsten Part wird nochmals auf Vererbung eingegangen.
n0x-f0x
Dies ist mein erstes Tutorial also seit nicht zu streng mit der Kritik, über Verbesserungsvorschläge würde ich mich dennoch freuen!
Ich setze voraus, dass man weiß wie Funktionen geschrieben werden und dass man mit Variablen umgehen kann. Außerdem sollte man folgende Parts meines Tutorials gelesen haben:
- [wiki]OOP Objektorientierte Programmierung in PHP - Part 1[/wiki]
- [wiki]OOP Objektorientierte Programmierung in PHP - Part 2[/wiki]
- [wiki]OOP Objektorientierte Programmierung in PHP - Part 3[/wiki]
- [wiki]OOP Objektorientierte Programmierung in PHP - Part 4[/wiki]
- [wiki]OOP Objektorientierte Programmierung in PHP - Part 5[/wiki]
Dieser Part behandelt die Vererbung nochmal genauer.
Hier der Quellcode den ich in diesem Part besprechen will. Er setzt sich aus dem Quellcode von Part 4, dem Wissen aus Part 5 und dem neuen aus diesem Part zusammen:
Quellcode
- abstract class Raumschiff
- {
- protected $leben; //protected ist aus Part 5
- protected $panzer;
- protected $ladung;
- public function __construct()
- {
- $this->leben = 100;
- $this->panzer = 100;
- $this->ladung = array();
- }
- public function fliegen()
- {
- echo "Captain, wir fliegen mit ".self::GESCHWINDIKEIT." Lichtjahren/Sekunde durchs All";
- }
- public function attacke()
- {
- echo "Captain, wir greifen mit ".self::ANGRIFFSWERT." Schuss/Sekunde an";
- }
- public function einladen($ware)
- {
- $bereitsGeladen = 0; //speichert was schon eingeladen wurde
- foreach($this->ladung as $geladen) //Schleife die alle ladungen durchläuft
- {
- $bereitsGeladen += $geladen->getPlatz(); //die "aktuelle" ware prüfen, wieviel platz sie braucht
- }
- if(($ware->getPlatz()+$bereitsGeladen)<=self::LADERAUM_KAPAZITAET) //passt die neue ladung noch rein?
- {
- $this->ladung[$ware->name] = $ware; //wenn ja, einladen
- } else
- {
- echo "Nicht genug Platz!"; //sonst fehler erzeugen
- }
- }
- public function ausladen($warenname)
- {
- $ware = $this->ladung[$warenname]; //ware zwischenspeichern
- unset($this->ladung[$warenname]); //ware ausladen
- return $ware; //zwischenspiecher zurückgeben
- }
- public function minorLeben($diff) //Leben verkleinern
- {
- if(is_numeric($diff)) //Das Leben muss um eine Zahl verkleinert werden
- {
- if($diff<0) //Wenn die Zahl kleiner als 0 ist...
- {
- $this->leben += $diff; //...wird eine negative Zahl zum leben hinzugefügt...
- } else //..sonst...
- {
- $this->leben -= $diff; //...wird die positive zahl abgezogen!
- }
- }
- }
- public function reparieren($diff) //Leben erhöhen
- {
- if(is_numeric($diff)) //Das Leben muss um eine Zahl verkleinert werden
- {
- if($diff>0) //Wenn die Zahl größer als 0 ist...
- {
- $this->leben += $diff; //...wird eine positive Zahl zum leben hinzugefügt...
- } else //..sonst...
- {
- $this->leben -= $diff; //...wird die negative zahl abgezogen! (minus und minus macht plus)
- }
- }
- }
- public function getLeben()
- {
- return $this->leben;
- }
- public function getPanzerung()
- {
- return $this->panzer;
- }
- }
- class Jaeger extends Raumschiff //Die Klasse Jäger "erbt" von der Klasse Raumschiff
- {
- const GESCHWINDIKEIT = 50;
- const ANGRIFFSWERT = 50;
- const LADERAUM_KAPAZITAET = 10;
- public function __construct()
- {
- parent::__construct(); //Standardwerte über den geerbten Konstruktor laden
- $this->panzer = 25; //Standard Panzerung ist nicht für den Jäger gültig...
- }
- }
Das neue findet sich gleich in der 1.Zeile. Das keyword abstract (abstrakt). Wird eine Klasse als abstact definiert, so kann man keine Instanz dieser Klasse (also kein Objekt der Klasse) erzeugen. Man kann auch Methoden als abstract definieren, jedoch MUSS eine Klasse, sobald sie auch nur eine einzige abstakte Methode hat, auch abstrakt sein.
Jetzt auf unsere Raumschiffe bezogen: es sollte NIE das Raumschiff "Raumschiff" geben, das ist ja nur der Prototyp für alle anderen Raumschiffe, deswegen muss diese Klasse abstract sein! Jetzt zu den abstract methods:
Quellcode
Wer möchte kann den Code mal ohne die Funktionsdefinition in der Klasse Jaeger laufen lassen. Das wird Fehler erzeugen! Einer abstrakten Methode wird kein Quellcode zugeordnet. Sie hat nur eine Funktion: die Kindklasse dazu "zwingen", eine Methode mit dem selben Namen und mit den selben Parametern (die Parameter dürfen sich nicht in Anzahl oder Namen unterscheiden) zu definieren. Dabei ist zu beachten das es nur strengere Sichtbarkeiten gibt. Also wenn man protected angegeben hat muss die Funktion nachher protected oder private sein.
Das abstract keyword wird mit PHP 5 eingeführt und ist voher nicht verfügbar!
Im nächsten Part wird nochmals auf Vererbung eingegangen.
n0x-f0x
9.136 mal gelesen