Moin. Ich wurde heute vor folgendes Problem gesetzt und bräuchte ein paar Tipps, wie/ob sich das schön lösen lässt. Das Beispiel ist abgeändert aber semantisch äquivalent.
Zunächst gibst es ganz unten dieses package:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
|
<?php
interface CreatureCondition
{
public function fulfillsCreature(Creature $creature): bool;
}
interface Creature
{
public function fulfills(CreatureCondition $condition): bool;
}
|
Darauf folgen diese beiden packages:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?php
interface HumanCondition extends CreatureCondition
{
public function fulfillsHuman(Human $human): bool;
}
class Human implements Creature
{
public function fulfills(CreatureCondition $condition): bool
{
}
}
// ----
interface AnimalCondition extends CreatureCondition
{
public function fulfillsAnimal(Animal $animal): bool;
}
class Animal implements Creature
{
public function fulfills(CreatureCondition $condition): bool
{
}
}
|
Der untere "Layer" bzw. das package mit Creature darf/soll kein Wissen über die möglichen packages darüber haben. Die packages Human bzw. Animal wissen von dem Creature package (sie erweitern es ja). Nun sollen aber Animal bzw. Human wissen, dass sie die konkreten fulfillsHuman bzw. fulfillsAnimal Methoden aufrufen sollen. Wie lässt sich das schön lösen? Geht das überhaupt? Wir sind in PHP, da geht viel "dreckiges" aber ich würde es gerne sauber halten, also keine PHP-Magic oder Upcasts oder dergleichen (wenn es sich vermeiden lässt). Aber mir fällt nur ein, dass das man bereits im Creature package ein Visitor-interface implementiert und damit die oberen packages Animal und Human kennen müsste. Bin für jede Idee offen.