Hallihallo,
irgendwie stehe ich momentan auf dem Schlauch. Ich weiß nicht, wie ich elegant die folgende Idee umsetzen kann:
Ich bastele gerade an einer Direct3D-Engine rum, und dort habe ich eine Hauptklasse, die das Ausgabefenster und die Geräteschnittstelle etc. erstellt.
Jetzt möchte ich in dieser Klasse eine Liste mit Elementen einer so genannten "Entity"-Klasse haben. Ein Entity ist im Grunde irgendein x-beliebiges 3D-Objekt. Diese Liste wird dann in der RenderWorld()-Funktion durchlaufen und jedes Objekt gezeichnet werden.
Aber wie schaffe ich es jetzt bei der Erstellung einer Instanz der Entity-Klasse, dass sich diese in (die für sich ja nicht sichtbare) Hauptklasse einzutragen?
Muss ich die Erstellungsmethode in der Hauptklasse implementieren?
Oder kann man "Klassen in Klassen" machen?
Oder gibt es sogar schlauere Ideen? Mir fällt momentan nichts sinnvolles ein...
Vielen Dank im Voraus für alle Antworten,
Gruß, Pac-Man
[.NET] Klasse, die sich in Liste anderer Klasse einträgt
-
PacMani -
18. Dezember 2010 um 19:49
-
-
Einfach ne List<Entity> in der Hauptklasse? Ich lös sowas immer so, dass es eine Workspace-Klasse gibt, und jede andere Klasse enthält eine Referenz auf ihren Workspace. So lassen sich Objelte einfach verwalten und die Klassen können sich selbstständig zB in eine Liste im Workspace eintragen.
-
Ich weiß grad nich was genau das Problem ist, aber das scheint mir eine einfache Anwendung vom Observer-Pattern zu sein.
Du kannst ja in der Entity-Klasse im Konstruktor einfach die Hauptklasse als Argument übergeben, sodass dann dort eine Methode aufrufen kann, die sie einträgt, oder nicht? Also sowas in Pseudocode(keine Ahnung welche Sprache du hast und wie das da funzt...)
Code
Alles anzeigenclass Main { List<Entities> entityList; Main() { createEntities(); /* do something fancy */ drawAll(); } createEntities() { /* Create some entities... */ createEntity(this); createEntity(this); createEntity(this); } register(Entity e) { entityList.add(e); } drawAll() { foreach (Entity e : entityList) { e.draw(); } } } class Entity { Entity(Main m) { m.register(this); } draw() { /* code */ } }
-
Deine Lösung, friedrichheinze, klingt ganz gut. So wie man in Direct3D (fast) immer den Adapter für etwaige Vorgänge angeben muss, gibt man bei meiner Klasse dann eben die Hauptklasse an.
Ich weiß auch nicht wie ich da gestern darauf kam, aber ich dachte, man könne die Hauptklasse auch irgendwie global für alle Klassen der DLL festlegen, sodass diese dann einfach auf diese Variable zugreifen.
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!