2010-01-28 13 views
6

Betrachten Sie diese Situation: Ich habe einen Aquarium-Simulator, wo ich 5 verschiedene Arten von Fischen habe. Unterschiedliche Typen bedeuten unterschiedliche Attribute (Geschwindigkeit, Farbe, Hunger usw.). Was, wenn ich möchte, dass der Benutzer meines Simulators in der Lage ist, einen neuen Fischtyp zu erstellen und ihm seine Werte für seine Attribute zu geben?Neue Klassen von Benutzern erstellt?

Wie wird das vom Programmierer implementiert? Benötige ich eine Art "Ereignisbehandlung", die in meiner "Fish" -Klasse einen bestimmten Satz von Codezeilen hinzufügt? Ist das überhaupt ein gültiger Gedanke?

(Falls es wesentlich ist, ist die Sprache Java. Und um Missverständnisse zu vermeiden und Kommentare wie "Ist das Uniarbeit?" Zu vermeiden, ja. Aber ich suche nicht nach der Antwort, ich bin neugierig auf die Konzept)

EDIT:. Ja, mein schlecht, dass ich nicht die Interaktion Art und Weise nicht erwähnt: eine GUI.

Stellen Sie sich eine Registerkarte namens "Neue Arten hinzufügen" vor, die für jedes Attribut der Fische ein Feld enthält (Typ, Geschwindigkeit, Farbe usw.). Also füllt der Benutzer die Felder mit den entsprechenden Werten aus und wenn er auf "Hinzufügen" klickt, wird der Konstruktor aufgerufen. Zumindest stelle ich mir das so vor. :)

+0

Interessant. Java-Metaklassen in Aktion. –

Antwort

0

Werfen Sie einen Blick auf die type object pattern. Auch Google for it Ich habe nur eine der ersten Referenzen, die ich gefunden habe ...

Sie können auch die Reflection pattern suchen ...

+0

Der Artikel, der es mir völlig klar gemacht hat, ist dieser: http://gameprogrammingpatterns.com/type-object.html Danke, tolles Muster im Allgemeinen und Spot-on im Besonderen! –

1

Ich würde nur eine Karte verwenden:

class Fish 
{ 
    Map<String,String> attributes = new HashMap<String,String>(); 
    setBusterFish() 
    { 
    attributes.put("speed", "5"); 
    attributes.put("colour", "red"); 
    attributes.put("hunger", "10"); 
    attributes.put("name", "buster"); 
    } 
} 
1

Java ist eine OO-Sprache, und es befasst sich in Klassen und Objekte. Die verführerische, naive Lösung wäre, dass Ihr Programm mit "Klassen" von Fischen fertig wird, so wie es sich mit Klassen von irgendetwas beschäftigt, d. H. Um Java-Code zu erzeugen und den Compiler und den Loader in die Laufzeit einbringen zu lassen.

Dieser Ansatz kann gemacht werden, um mit etwas Peinlichkeit zu arbeiten. Im Wesentlichen würde Ihre Kodierung "dynamische Java-Klassen" wahrscheinlich viel größer und komplizierter werden, als Ihre Aufgabe eigentlich beabsichtigt.

Sie müssen dies nur wirklich tun, wenn Sie tatsächlich verschiedene Attribute (nicht nur unterschiedliche Werte dieser Attribute) für Ihre verschiedenen Fische haben; und selbst dann gibt es einfachere Lösungen.

Für was gefragt wird, denke ich, dass Sie wirklich nur eine Fish Klasse benötigen. Wenn der Benutzer einen neuen definiert, definiert er wirklich die Attributwerte.

Wenn Sie wirklich neue und dynamische Attribute möchten, dann könnten Sie einen langen Weg mit z. a HashMap zum Speichern von Name/Wert-Paaren. Sie könnten den Benutzer "legs"/"4" hinzufügen lassen und dann dieses neue Attribut unverändert ausgeben; aber Sie konnten den Fisch nicht auf diesen Beinen laufen lassen, weil Ihnen die Codierung fehlte, um mit dem neuen Attribut zu arbeiten.

+0

Was ist, wenn er einen neuen definiert, dann zwei weitere eines bereits vorhandenen Typs erstellt und dann einen anderen des neuen Typs, den er zuvor erstellt hat, benötigt? Die "Standard" -Attribute jedes neuen Typs müssen irgendwo gespeichert werden, so dass Benutzer sie nicht jedes Mal neu einfügen müssen. –

+0

Wirklich, Sie werden Ihre Benutzer nicht dazu bringen, neue Fishs einzugeben - Sie erhalten sie, um neue 'FishPrototypes' oder' FishSpecies' oder 'FishMetadata' einzugeben. Also, wenn du 'class Fish {private FishSpecies speciesInformation; } 'und dann für jeden Eintrag eine neue' FishSpecies' erstellen; Sie können leicht 'new Fish (lachsspeziesInformation)' jedes Mal, wenn sie einen neuen Lachs wollen, nennen. Andere Möglichkeiten sind die Verwendung von 'originalFish.clone()', um einen vorherigen Fisch zu kopieren, 'Fish.copyOf (originalFish)' 'oder' new Fish (originalFish) '... es gibt viele mögliche Ansätze. – Cowan

0

Lassen Sie den Benutzer Attributwerte einer Instanz von beispielsweise einer FishSpecies-Klasse definieren und geben Sie der FishSpecies eine Methode createFish, die einen Fisch dieser Spezies erstellt (d. H. Diese Attributwerte hat). Die Verfolgung aller FishSpecies-Objekte in einer Liste bietet Ihnen die Möglichkeit, FishSpecies-Objekte zu verwalten und Fischobjekte bestimmter Arten zu erstellen.

Wenn ich Ihre Frage richtig verstehe, dann glaube ich, dass Dinge komplizierter als das ist ein Fehler.

Verwandte Themen