Abstrakte Klassen

Abstrakte Klassen

Bislang wurden nur Objekte vorgestellt, von denen man auch eine Objekt erstellen kann. Es kann jedoch sinnvoll sein gemeinsame Funktionalität in einer Klasse auszulagern, die man nicht direkt verwenden kann.

Beispiel:

<?php
	abstract class Vehicle {
		protected $hornMelody = '';	

		public function getHornMelody() {
			return $this->hornMelody;
		}
	}

	class Car extends Vehicle {
		public function __construct() {
			$this->hornMelody = 'mooop';
		}
	}

	class Bike extends Vehicle {
		public function __construct() {
			$this->hornMelody = 'ringringring';
		}
	}

	class PoliceCar extends Car {
		public function __construct() {
			$this->hornMelody = 'lalülala';
		}
	}

	$vw = new Car();
	$policeVw = new PoliceCar();
	$myBike = new Bike();

	echo $vw->getHornMelody();
	echo $policeVw->getHornMelody();
	echo $myBike->getHornMelody();
?>

Zugegeben, dass Beispiel ist eher theoretisch, aber es ist ganz gut um das Prinzip zu erklären. Eine Fahrrad, ein Auto und ein Polizeiauto sind im weitesten Sinne „Fahrzeuge“.


Dabei dient die Klasse Fahrzeug nur zur Zusammenfassung der gemeinsamen Eigenschaften. In diesem Fall die Melodie der Hupe.


Es macht keinen Sinn eine Instanz eines Fahrzeuges direkt zu erstellen. Das Schlüsselwort abstract verbietet es sogar.

Die Verwendung einer abstrakten Klasse macht Sinn wenn gemeinsame Funktionalität in eine Basisklasse auslagert werden kann und man diese nicht instanzieren können muss.

Abstrakte Methoden

Neben abstakten Klassen, kann man in einer Klasse auch abstrakte Methoden definieren. Das dient dazu, dass die erbende Klasse diese Methode implementieren muss. Es kann also mit einer abstrakten Methode eine Schnittstelle „erzwungen“ werden.


Eine abstrakte Methode in dem vorheringen Beispiel kann so aussehen:

<?php 

	abstract class Vehicle { 
		abstract public function getHornMelody(); 
	} 

	class Car extends Vehicle { 
		public function getHornMelody() { 
			return 'mooop'; 
		} 
	} 

	class Bike extends Vehicle { 
		public function getHornMelody() { 
			return 'ringringring';	 
		} 
	} 

	class PoliceCar extends Car { 
		public function getHornMelody() { 
			return 'lalülala'; 
		} 
	} 

	$vw = new Car(); 
	$policeVw = new PoliceCar(); 
	$myBike = new Bike(); 

	echo $vw->getHornMelody(); 
	echo $policeVw->getHornMelody(); 
	echo $myBike->getHornMelody(); 
?>

Die Ausgabe ist die gleiche. Aber die Implementierung ist anders. In diesem Fall wird in der abstrakten Klasse festgelegt, dass jede Klasse die von „Vehicle“ erbt immer die Methode „getHornMelody“ implementieren muss.


Im vorherigen Beispiel hätte die Zuweisung der Melodie auch übersprungen werden können. In diesem Fall wird man jedoch dazu gezwungen die Methode zu implementieren. Dies ist sinnvoll wenn ein unterschiedliches Verhalten benötigt wird. Das Beispiel 1 bietet lediglich die Möglichkeit durch Zuweisung des attributes hornMelody die Melodie der Hupe zu ändern. Das Verhalten ist jedoch in der Basisklasse implementiert.

Bei der zweiten Variate ist das Verhalten in jedem Objekt implementiert und dadurch sind mehr Möglichkeiten gegeben.


Beide Varianten machen Sinn. Es kommt immer auf den Anwendungsfall an. Ich hoffe du konntest soweit folgen :)

Navigation