Diese Frage ist eine Folge zu this. Ich versuche, Klassenherarchien zu definieren, an denen mehrere Basenpaare beteiligt sind. Als anschauliches Beispiel nehme ich an, dass ich eine Klasse Animal
und eine Klasse Food
habe. Animal
hat eine rein virtuelle Funktion, um seine Essensvorliebe zu markieren, ein Essen als Parameter nehmend.Liskov-Substitutionsprinzip und mehrere Hierarchien
Ich muss Code schreiben, der nur mit diesen Basisklassen befasst und die reine virtuelle Funktion aufruft. Zum Beispiel habe ich eine ZooManager
Klasse, die Essensvorlieben für jedes Tier festlegt.
class ZooManager
{
vector<Aninal*> animals;
public:
void setAllPreferences(vector<Food *> foods) {
assert(animals.size() == foods.size());
for(int i =0;i<animals.size();i++) {
animals[i]->setFoodPreference(foods[i]);
}
}
};
So weit so gut. Nun ist das Problem, dass es viele verschiedene abgeleitete Klassen für Food
und Animal
gibt. Food
hat abgeleitete Klassen Fruit
und Meat
, und Animal
hat abgeleitete Klassen Carnivore
und Herbivore
. Herbivore
kann nur Fruit
als Nahrungsmittelpräferenz annehmen, und Carnivore
kann nur Meat
annehmen.
Kann ich eine Klassenhierarchie dafür erstellen, ohne das Liskow-Substitutionsprinzip zu verletzen? Obwohl ich in dieser Frage C++ verwende, würde ich auch Java-spezifische Antworten begrüßen.
Ich mag die Enum-Lösung nicht in erster Linie, weil es so oft verwendet wird, um OO-Programmierung zu missbrauchen, im Wesentlichen setzen Kind Klasseninformationen in eine Basisklasse. Ich habe Code gesehen, wo 'Base' eine Aufzählung für' Type' mit den Werten 'CHILD1, CHILD2, CHILD3' etc. hat. Das ermutigt dann einen Haufen Code, eine' Base * 'zu akzeptieren, und fährt fort, um den zugrundeliegenden Typ zu überprüfen . Ein solcher Code spiegelt jemanden wider, der denkt, dass er alle Vorteile des Polymorphismus mit keinem der Nachteile nutzen kann. 'dynamic_cast' weg ist auch nicht viel besser. – AndyG
@AndyG Ich habe nicht gesagt, dass es eine * großartige * Lösung war; Aber wie oben beschrieben, kümmert sich jede Tierart darum, was für eine Art Nahrung sie bekommt. Grundsätzlich leckt die Abstraktion hinter der Food-Klasse *, denn Food ist eine ziemlich nutzlose Abstraktion; Die Handhabung von rohem Fleisch auf die gleiche Weise, wie du mit Heu hantierst, ist eine sehr fragwürdige Sache. – Yakk
Einverstanden. Ich denke, OP hat sich selbst in eine Ecke gebaut. Mit meinem Kommentar wollte ich Ihnen nicht widersprechen, aber Sie sollten betonen, warum die "Lösungen" für das OP-Problem nicht wünschenswert sind. – AndyG