Klassentyp zur Laufzeit ändern?

SimProtect

Aktives Mitglied
Hallo,

Ich erstelle gerade das Konzept für ein Projekt und habe gleich eine Frage:
Kann ich die Klasse eines Objekts zur Laufzeit ändern?

Kontext:
Ich habe drei Typen Agenten. Rote, Blaue und Grüne. Jede Farbe verhält sich anders, aber Agenten können die Seiten wechseln. Ich habe mir überlegt, eine abstrakte Oberklasse zu entwerfen. Somit kann ich einige Dinge vereinfachen und das Programm erweiterbar halten. Andere Entwickler sollen eigene Agenten entwerfen und problemlos einfügen können.
Zur Beginn werden alle Agenten bei einem Organizer angemeldet. Dieser plant wann welcher Agent etwas tut. Ich halte es daher für schwierig (nicht unmöglich), ein Objekt einfach zu löschen und durch ein anderes zu ersetzen.

Kann ich einen roten Agenten zur Laufzeit in einen grünen Umwandeln?
Alle Agenten verfügen über die Methode action. In der werden alle Sachen programmiert, die ein Agent tut, wenn er dran ist. Ziel ist, dass ein Agent nach seiner Änderung auch den Inhalt der Methode der anderen Farbe ausführt.

Alternativ kann ich über Booleans steuern. Dann nehme ich mir aber Flexibilität weg. Und wenn viele weitere Parteien dazukommen, wird das ein Chaos aus IF-Abfragen. If(blau) .. if(rot) .. if(grün) .. if(weiß) .. if(rosarot) .. 😱

Mfg
 
Mache nur eine Klasse Agent. Dieser Agent besitzt ein privates Instanzattribut vom Typ (abstrakten) Typ AgentBehavior. Zusätzlich noch Setter, sodass diese verschiedenen Verhaltensweisen geändert werden können. Ggf. sind diese AgentBehavior immutable, sodass diese als statische Konstanten nur einmal erzeugt werden müssen.
 
Ich guck mal ob ich das richtig verstanden habe. Die Idee ist, das Verhalten auf externe Klassen outzusourcen, richtig? Eine davon wird jetzt Attribut für einen Agent. Deren Methoden werden durch die Methode action des Agenten aufgerufen.
Klingt nach einer guten Idee für mich 🙂
 
Verwende doch einfach eine Abstrakte Superklasse oder ein Interface, so kannst du in deinen Methodendeklarationen einfach den Supertyp und oder deren Subklassen oder alle Klassen übergeben die das Interface erfüllen.

z.B könnten deine 3 Klassen , Blau Grün und Rot jeweils von einer Abstrakten klasse abgeleitet werden

und in der Methode oder wo auch immer du Objekte verwenden möchtest kannst du den Supertyp als parameter setzen

Angenommen deine 3 Klassen leitest du von der Abstrakten Klasse Agent ab , dann könntest du sowas Schreiben :

Java:
public class Blau extends Agent{...}

Java:
public String getValue(Agent agent){
...
}

und so die methode verwenden

Java:
Blau blue = new Blau();

...

getValue(blue);

oder du implementierst ein Interface ( oder auch einfach ein Marker Interface) und kannst die Methode dann so z.B deklarieren

Java:
public class Blau implements Editable{...}

Java:
public String getValue(Editable agent){
....
}

So kannst du auch später falls du neue Agenten benötigst (z.B Lila) einfach das Interface Implementieren und trotzdem alle Methoden etc. verwenden , so bleibst du maximal Flexibel.

insofern ich dich richtig verstanden habe 😉
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben