Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

21

04.07.2011, 17:29

Also möchte ich abfragen: Ist diese Einheit ein Krieger? etc. :D

Warum willst du das tun? Wenn du das tun willst heißt das du hast ein Designproblem....
Und wenn man es doch braucht, warum reicht eine einfache Funktion der Art GetUnitType() nicht aus?

babelfish

Alter Hase

  • »babelfish« ist der Autor dieses Themas

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

22

04.07.2011, 17:34

Ja, ich find wirklich kein Beispiel wo es wirklich dringend nötig wird. Hab deshalb das Beispiel nicht am Anfang gebracht, weils bisher eig. gar nicht verwendet wird. Vllt. Später für KI oder so.
Natürlich reicht ne überladene Funktion aus, mir gings mehr darum obs überhaupt was in der Richtung gibt =D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

23

04.07.2011, 18:26

Es wurden ja schon Wege genannt aber wie gesagt sind das nur Painkiller und keine Lösungen für das wirkliche Problem. Das verbirgt sich nämlich hinter der Tatsache warum du sowas überhaupt tun willst. Die Lösung heißt virtuelle Methoden wie Sylence schon gesagt hat. Und damit mein ich keine virtuelle GetType() Methode.

Also möchte ich abfragen: Ist diese Einheit ein Krieger? etc. :D

Warum willst du das tun? Wenn du das tun willst heißt das du hast ein Designproblem....
Und wenn man es doch braucht, warum reicht eine einfache Funktion der Art GetUnitType() nicht aus?

Eine GetUnitType() Methode ist auch nix Andres als ein selbstgebauter typeid-Operator, da kannst du genausogut einfach den in C++ eingebauten nutzen. Aber wenn man meint sowas zu brauchen steckt praktisch immer ein Designproblem dahinter. Denn überleg mal was es eigentlich bedeutet wenn du den Laufzeit-Typ eines Objektes bestimmen willst um zu entscheiden was damit getan werden muss. Das bedeutet schlicht und einfach dass deine Abstraktion widersprüchlich ist. Wenn du eine Funktion hast die mit Units arbeitet aber für eine bestimmte Art von Unit etwas anderes machen soll als für eine andere Art von Unit dann heißt das: Dein Konzept einer Unit ist unvereinbar mit der Operation die du gerade zu implementieren versuchst. Meistens wird das daran liegen dass die Operation in ihrer Natur spezieller als Unit ist. Aber du musst in jedem Fall entweder die Schnittstelle Unit überdenken oder die Sinnhaftigkeit dessen was du gerade damit vorhast.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (04.07.2011, 18:46)


24

05.07.2011, 12:39

Hm, und wie sieht es hier aus?

Sagen wir mal ich habe 2 Entities und habe jetzt festgestellt, dass beide kollidieren. Nun kann ich ja von dem einem eine virtuelle Methode aufrufen onTouch oder so. Damit kann ich für jeden Entity-Typ bestimmen was passiert, wenn er mit irgendwas zusammen stößt, ohne das ich die unterscheiden muss, so weit so gut. Aber sagen wir, ich möchte unterschiedliche Dinge tun, je nachdem, mit was für einem Objekt ich zusammengestoßen bin. Ich müsste dann ja in der onTouch Methode irgendwie zwischen den Typen unterscheiden, weil ich ja bei speziellen Kombinationen auch die speziellen Werte der Typen benötige. Wäre dann für dich ein dynamic_cast immer noch ein Designfehler? Wie würde man es sonst elegant machen, eine Methode in Abhängigkeit von 2 Typen aufzurufen (hört sich irgendwie nach Templates an, aber die Typen sind ja zur Compilierzeit noch unbekannt).
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

26

05.07.2011, 13:00

Ich finde diese pauschale aussage dass typüberprüfungen schlechtes desingn sind auch ziemlich platt ausgedrückt. man kann sicherlich komplizierte pattern nutzen aber ich würde mich in zweifel für die typüberprüfung entscheiden - und wenn es ein enumwert ist. in c# macht man auch ohne ende gebrauch davon...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

27

05.07.2011, 13:02

Ich sag auch nicht dass jede Typprüfung zwangsweise immer schlechtes Design ist. Aber ein Typeswitch halte ich rein prinzipiell für schlechtes Design, ganz unabhängig von irgendeiner Sprache. Warum hab ich ja oben schon genau erläutert. Ein Typeswitch weist imo darauf hin dass an deiner Abstraktion was faul ist.

Iin c# macht man auch ohne ende gebrauch davon...

Also ich nicht, außer das Framework zwingt mich dazu. In diesen Fällen ist es aber meistens so dass aufgrund restlichen Struktur meines Programmes der nötige Downcast nur Formalität ist und niemals fehlschlagen kann...

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (05.07.2011, 13:14)


Werbeanzeige