Hallo Matthias,
so, Fußball ist vorbei und ich melde mich wie versprochen zurück.
Nachdem ich mir gerade den Thread und auch meine Antwort nochmal durchgelesen habe, glaube ich, dass mein beschriebener Ansatz tatsächlich funktionieren könnte. Allerdings habe ich noch keine wirkliche Idee, wie man anhand dieses Beispiels Vererbung vernünftig darstellen/erklären könnte. Wahrscheinlich könnte man schon eher DI erklären, was aber bestimmt zu Anfang zu weit führen würde. Ich überlege aber weiter.
Ich hab von Pascal überhaupt keine Ahnung. Noch nie was mit zu tun gehabt.
Ich möchte aber, um die Idee etwas weiter zu spinnen, Whouzuos Beitrag aus einem anderen Post aufgreifen und versuchen, das Ganze ganz grob mittels PHP zu veranschaulichen. In diesem Beitrag steht:
Du wirst mir in PHP (ohne Nutzung einer Library, die multiple dispatch emuliert) keine Implementierung zeigen können, bei der du jeweils nur an einer Stelle im Code Änderungen vornehmen musst, um folgende Liste an fachlichen Änderungen durchzuführen:
- Spiel um eine Karte erweitern (oder um eine Karte löschen)
- Das Verhalten beim Vergleich von zwei Karten ändern
- Eine Karte in einem anderen Zusammenhang verwenden (z.B. als Restaurantkarte) ohne ihre bisherigen Eigenschaften zu verändern oder zu löschen (lediglich ggf. zu ergänzen) (= keine Verletzung von Seperation of concerns)
Ich gehe jetzt einfach mal davon aus, dass mit "nur an einer Stelle im Code Änderungen vornehmen" heißt, dass dies unabhängig von der neu zu erstellenden Klasse ist.
Sollte ich mit Folgendem falsch liegen, korrigiert mich bitte (ich hab das nicht getestet, es geht nur um's Prinzip. Allerdings sollten sich, wenn ich richtig liege, die vorherigen Aussagen widerlegen lassen).
<?php
abstract class SpielObjekt
{
protected $eigenschaften = array();
protected $angriffsvarianten = array();
public function getEigenschaften()
{
return $this->eigenschaften;
}
public function getAngriffsvarianten()
{
return $this->angriffsvarianten;
}
}
class Schere extends SpielObjekt
{
protected $eigenschaften = array(
'spitz');
protected $angriffsvarianten = array(
'schneiden');
}
class Stein extends SpielObjekt
{
protected $eigenschaften = array(
'hart');
protected $angriffsvarianten = array(
'zertrümmern');
}
class Papier extends SpielObjekt
{
protected $eigenschaften = array(
'flexibel');
protected $angriffsvarianten = array(
'einwickeln');
}
class Angriffszenarios
{
protected $erfolgreich = array(
'zertrümmern' => 'spitz',
'schneiden' => 'flexibel',
'einwickeln' => 'hart');
public function getErfolgreich()
{
return $this->erfolgreich;
}
}
class Prüfen
{
public static function sagMirDenGewinner(SpielObjekt $a, Spielobjekt $b, Angriffscenarios $angriff)
{
$vergleich = $angriff->getErfolgreich();
$ergebnisA = self::ergebnis($a->getAngriffsvarianten(), $b->getEigenschaften(), $vergleich);
$ergebnisB = self::ergebnis($b->getAngriffsvarianten(), $a->getEigenschaften(), $vergleich);
if ($ergebnisA > $ergebnisB) {
return 1;
} elseif ($ergebnisB > $ergebnisA) {
return -1;
}
return 0;
}
protected static function ergebnis(array $a, array $b, array $vergleich)
{
$punkte = 0;
foreach ($vergleich as $angriff => $eigenschaft) {
if (in_array($angriff, $a) && in_array($eigenschaft, $b)) {
$punkte++;
}
}
return $punkte;
}
}
Gruß, ich geh jetzt ins Bett
(T-Rex, hast Du eigentlich gesehen, dass ich auf Deinen Wunsch hin immer noch etwas hinter "Gruß" schreibe?),
Dennis