Objekt per If erzeugen.

DS4ever01

Mitglied
Hallo JavaFans,

leider wusste ich nicht genau wie ich das suchen soll.
Daher muss ich meine Frage stellen.
Leider weiß ich auch nicht ob mein Ansatz überhaupt richtig ist. Daher könnt ihr mich alles an Kopf werfen was euch einfällt =D

Ich habe ein String dessen Inhalt unterschiedlich sein kann.
BSP: CM, DA,OR oder TY
Abhängig vom String soll einen Objekt erstellt werden.
BSP: Object_CM unit = new Object_CM
dieses Objekt beinhaltet mehrere Methoden zum setzen von Variablen.

Das Objekt wollte ich im Programm wie folgt erzeugen (Damit ich nicht mehrmals für jedes Objekt den gleichen code verfassen muss)
Java:
public class Army {

DS_Unit cUnit = null;
....
....
public void erzeugeObject(String myString) {
   If (myString.equals("cavalry")) {
      this.cUnit = new Object_cavalry();
   } else if (myString.equals("tank")) {
      this.cUnit = new Object_tank();
   }else if(....)
      ....
}
cUnit.setUnitProfile(unitname);
....
}

Wie ihr erahnen könnt habe ich folgende Classen

DS_Army: Hier werden allgemeine Methoden aufgerufen und Objekt erzeugt.
DS_Unit: alle Variablen werden hier deklariert.
Object_cavalery extends DS_Unit: methode zum setzen von den Variablen. Hier ist eine Switch case Methode




Frage:
1. Wenn ich ein Objekt erzeugen will mit einer If anweisung, ist dies dann der richtige weg?
2. Wie greife ich dann auf die Methode der Object_tank oder _cavalery zu?
---> cUnit.setUnitProfile(String); klpat nicht, weil er hier dann auf DS_Unit zugreifen will und mir sagt, das diese Methode nicht vorhanden ist.

Fakt ist, dass ich anhand zweier unterschiedlicher Strings 1. ArmyName 2. EinheitenName auf eine Class zugreifen will und das Profil der Einheit ausgeben will. Wenn ich das alles für nur einen ArmyNamen programmiere, dann ist dies kein Problem und einfach umzusetzen. Doch macht mir das erzugen eines Objektes per If Kopfschmerzen.

Ganzen code will ich ungerne Posten, da dies ein betehendes programm ist welches ich umschreibe.

Sollte einer nun wirklich hier unten angekommen sein, dann danke für dein Interesse mir zu helfen =D

Gruß
 
Vieleicht wäre es sinnvoll eine abstrakte Klasse zu erstellen, die dann entsprechend mit den gewünschten Methoden überschrieben wird. Außerdem könntest du dann als Rückgabetyp deiner Methode die abstrakte Oberklasse wählen.
zu deiner Frage : Du erzeugst ja nicht mit einer if abfrage ein Objekt, sondern eigentlich nach der Überprüfung. Dh. du kannst ganz normal den Konstruktor aufrufen
 
Ich würde statt if else switch,case nehmen.

Deine Objekte Objekt_cavalry und Objekt_tank müssen DS_Unit implementieren oder erweitern.

z.B. könntest du in DS_Unit die Methoden bewegen () und angreifen() haben. Diese kannst du dann aufrufen und wie sich bewegt würdest du dann in die erweiterte Klasse schreiben. (Wäre das mit der abstrakten klasse)
 
cUnit.setUnitProfile(unitname);
Das hier wird so nicht gehen wenn diese Methode in der Klasse DS_Unit nicht bekannt ist. Du musst unterscheiden zwischen Compile-Zeit und Laufzeit. Zur Compile-Zeit zeigt die Referenz cUnit auf ein Objekt der Klasse DS_Unit und da gibt es eben diese Methode nicht. Zur Laufzeit würde er schon die richtige Methode aufrufen wenn du z.B. auf eine cavalry casten würdest. Aber das ist auch so eine Sache weil du zur Compilezeit wiederum nicht weisst auf was du denn casten sollst.
Also ist es am richtigsten wenn alle Methode die die auf diese Art aufrufen willst in der Superklasse definiert sind und in den Subklassen überschrieben werden.
Und ob du deine Abfragen mit if/else oder switch/case machst ist so was von wurscht. Richtig war es jedenfalls wie du es hattest.
 
Hi zusammen,
das mir hier ein Konzept fehlt? dachte habe mein Konzept ausführlich beschrieben.

Aber danke dir JStein anscheinend bin ich nicht auf dem Holzweg. Werde mal rumprobieren und die Tage mich erneut melden.
Schönes WE euch allen ! =)
 
Kann man doch prima Reflections benutzten oder verstehe ich hier die Frage falsch?
Code:
interface DS_Unit {
...
}

class DS_Unit_Factory {

public static DS_Unit createClass(String name) {
DS_Unit unit = null;
  
  Class c = Class.forName(name);
  unit = (DS_Unit) c.getDeclaredConstructor().newInstance();

return unit;
}
}

*Code ist gerade aus dem Kopf heraus
 
Kann man doch prima Reflections benutzten oder verstehe ich hier die Frage falsch?
Ja, ich glaube die Frage hast du ein bisschen falsch verstanden. Das Erzeugen der Objekte ist ja nicht das Problem. Das hat er ja schon richtig gehabt. Er möchte nun Methoden aufrufen die die Klasse DS_Unit nicht kennt. Und das wiederum könnte man natürlich auch via Reflections machen. Das halte ich aber für etwas overkilled. Das einfachste ist diese Methoden in der DS_Unit zu deklarieren. Abstrakt oder auch nicht. Das hängt von den beteiligten Klassen ab, z.B. will man auch Instanzen von DS_Unit erzeugen ? Oder "darf" man überhaupt diese DS_Unit-Klasse verändern ?
 
Habe zuerst auch kurz darüber nachgedacht, wie es ist abstrakte Klassen zu verwenden bis ich dein Extends sah. Und außerdem würde da je nach Methodenhaufen der Code für das Modellieren auch ganz schön stramm aussehen.

Du versuchst je nachdem eine der zwei Klassen in DS_Unit zu speichern?
Also was ich seltsam finde, ist dass du die Variablen in einer Klasse deklarierst, aber sie in einer initialisierst. Wieso trennst du diese Verfahren und packst sie nicht in eine Klasse? Wenn ich das richtig verstehe, repräsentieren diese beiden Klassen dein Model.

Aufgrund dessen, wenn du die Variablenhandhabung hast, kannst du mit DS_Army deine Methoden aufrufen.

Es gibt viele Wege das zu realisieren. Du könntest auch mit Enum oder selbst implementierten TYPE... arbeiten.
Aber was auf jeden Fall nicht geht, ist, dass du versuchst ein Objekt einem anderen Objekt zuzuordnen, wenn diese vollständig unabhängig voneinander sind.
 
Wieso trennst du diese Verfahren und packst sie nicht in eine Klasse?
Wir wissen zu wenig über die Variablen und die Klassen. Aber es kann doch Sinn machen die Variable in einer Superklasse zu definieren, die Art und Weise wie sie gefüllt/initialisiert werden muss aber in den Subklassen jeweils klassenspezifisch realisiert werden.
Du versuchst je nachdem eine der zwei Klassen in DS_Unit zu speichern?
Ja , er hat eine Variable cUnit die auf Objekte vom Typ DS_Unit zeigen kann. Und das können dann entweder cavalry-Objekte oder tank-Objekte sein (evtl. noch weitere). Soweit auch noch ganz normal. Alles was er jetzt noch schaffen muss ist dem Compiler klarzumachen dass cUnit auf ein Objekt zeigt das die Methode "setUnitProfile(String)" kennt. Und DS_Unit kennt diese eben (noch) nicht. Einfachste Lösung: DS_Unit mit einer abstrakten Methode mit dieser Signatur versehen, wie ja schon ganz oben mal vorgeschlagen wurde.

Was würde bei der Lösungsfindung denn ein Enum oder ein selbstimplementierter TYPE helfen, das habe ich nicht verstanden ?
 
Dass es sich um Vererbung handelt, habe ich leider übersehen bzw ist hier nicht explizit zu erkennen gewesen, wenn nur etwas indirekt in der Problemstellung.

Also entweder trennt man die Objekte oder man ruft eine abstrakte Klasse ins Leben. Anders kann ich es mir imho auch nicht vorstellen.

Naja ich dachte da so etwas wie einen Identifier, der später bei verschiedenen Methoden helfen könnte. Beispielsweise wenn caval.. Und Tank.. die gleiche Methode implementieren und der Verlauf sich verändert, je nachdem welches Objekt sie gerade aufruft. Aber das wäre nur eine kleine Spielerei, letztendlich doch keine Problemlösung..
 

Neue Themen


Zurück
Oben