2016-04-08 10 views
0

Ich habe eine Aufgabe, wo ich ein UML-Klassendiagramm für das Donkey Kong Original Spiel schreiben muss.Wenn das Vergleichen nach Typ schlecht ist, was tue ich in dieser Situation? (Polymorphismus)

Im Spiel gibt es kleine Zwischensequenzen, in denen bestimmte Entitäten (Unterklassen von Entitäten) manipuliert werden. Daher habe ich eine Cutscene-Klasse erstellt, um dies zu verwalten. Mein Problem ist, dass ich nicht alle meine Entity Subclasses in die Cutscene einbeziehen möchte, weil es mir unnötig erscheint (Es wird auch mein UML-Diagramm chaotisch aussehen lassen: p). Ich möchte meine Cutscene nicht nur meine Entity-Klasse einschließen lassen, sondern meine Sub-Entities als Feinde übergeben, um zu überprüfen, mit welcher Entity ich es zu tun habe, damit ich sie entsprechend manipulieren kann. (Es scheint sauberer?).

Allerdings lese ich hier: http://www.cplusplus.com/forum/general/21246/, dass es schlechtes Design ist, Polymorphismus auf diese Weise zu verwenden. Ich benutze es anscheinend zu einem anderen Zweck.

Wenn mir jemand sagen könnte, wenn ich ein Narr bin und was ich tun sollte, würde das sehr geschätzt werden!

URL Diagram

+1

Ihre Frage ist zu vage. Sie müssen uns zeigen, wie Ihre Klassen wirklich aussehen. –

+0

Wo glauben Sie, dass Ihre Klassen Polymorphie verwenden? –

+1

Ich stimme für die Migration dieser Frage zu [programmers stackexchange] (http://programmers.stackexchange.com/), wo sie zum Thema gehört. – Serdalis

Antwort

4

Wenn Sie den Typ eines Entity-Instanz zu überprüfen, haben einen Blick auf das Muster ‚Besucher‘, die eine Lösung für das Tun Doppel Dispatching in C++ ist.

class EntityVisitor { 
    virtual void Visit(const Ladder& ladder) = 0; 
    virtual void Visit(const Mario& mario) = 0; 
    ... 
}; 

Ihre 'Entity' hätte eine rein virtuelle Funktion, die einen 'Besucher' benötigt.

Und jede Unterklasse implementiert diese Methode * an die Besucher 'Besuch' Funktion übergeben.

void Mario::Accept(EntityVisitor& v) { 
    v.Visit(*this); // Calls the 'Mario' overload. 
} 
+0

Danke, das scheint wie eine machbare Lösung für das, was ich versuche zu erreichen. Lesen Sie es jetzt ein. –