Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [Java] Neues Objekt vom anderen Objekt (https://www.delphipraxis.net/146734-%5Bjava%5D-neues-objekt-vom-anderen-objekt.html)

xZise 26. Jan 2010 10:09


[Java] Neues Objekt vom anderen Objekt
 
Hallo,
ich wollte mal folgendes fragen: Ich habe ein Objekt einer bestimmten Klasse und möchte von der Klasse des Objekt ein neues Objekt erstellen.
Also es gibt das Interface i und die Unterklassen s und t und das Objekt o vom Typ i. Jetzt erstelle ich ein neues Objekt i o = new s() und würde gerne jetzt das in der obigen Zeile wiederholen. Wenn das obige aber ein t ist, dann soll er nicht ein Objekt von s sondern von t erzeugen.
Code:
i o = null;

if (Math.random() < 0.5) {
  o = new s();
} else {
  o = new t();
}

// Jetzt will ich das er das obige wiederholt:
o = new (Klasse von o)();
Ich hoffe ihr versteht was ich meine. :mrgreen:

MfG
Fabian

leddl 26. Jan 2010 10:32

Re: [Java] Neues Objekt vom anderen Objekt
 
Ich habe hier keine passende Entwicklungsumgebung, aber gibt es nicht eine Methode oder Eigenschaft getClass oder className?
Das kannst du dann zwar nicht genauso einbauen, wie du es oben in deinem Code stehen hast, da das soweit ich weiß einen String zurückgibt. Aber den kannst du dann ja immerhin abfragen und entsprechend dein neues Objekt erstellen ;)

DeddyH 26. Jan 2010 10:42

Re: [Java] Neues Objekt vom anderen Objekt
 
Und zur Not kannst Du Dir ja in einer Variablen merken, welchen Typ Du gerade erzeugt hast.

xaromz 26. Jan 2010 10:45

Re: [Java] Neues Objekt vom anderen Objekt
 
Hallo,

hast Du hier nicht eine grundlegend falsche Auffassung von Interfaces? Der Witz ist ja, dass es egal ist, welche Klasse sich dahinter verbirgt. Ich habe jetzt auch gerade keine IDE da, aber es würde mich wundern, wenn es ein getClass() bei Interfaces gäbe.
Wenn Du Zugriff auf das Interface hast, kannst Du ja eine Methode New() implementieren, die jeweils ein neues Objekt zurück liefert. Das ist die saubere Lösung.

Gruß
xaromz

xZise 26. Jan 2010 12:05

Re: [Java] Neues Objekt vom anderen Objekt
 
Zitat:

Zitat von xaromz
Hallo,

hast Du hier nicht eine grundlegend falsche Auffassung von Interfaces? Der Witz ist ja, dass es egal ist, welche Klasse sich dahinter verbirgt.[...]

Aber im Laufe des Programms kann man ein Objekt halt nach einem Verfahren erstellen (es handelt sich um eine Graphklasse einmal als Adjazenzmatrix und einmal als -liste). Und jetzt wollte ich, dass man einfach ein neues Objekt von der gleichen Variante erstellen kann.

Aber ich glaube das mit .New() dürfte da am saubersten sein.

Und es gibt die Methode .getClass() die gibt zwar kein String zurück, aber so richtig was anfangen kann ich damit auch nicht.

MfG
Fabian

xaromz 26. Jan 2010 12:18

Re: [Java] Neues Objekt vom anderen Objekt
 
Hallo,
Zitat:

Zitat von xZise
Aber im Laufe des Programms kann man ein Objekt halt nach einem Verfahren erstellen (es handelt sich um eine Graphklasse einmal als Adjazenzmatrix und einmal als -liste). Und jetzt wollte ich, dass man einfach ein neues Objekt von der gleichen Variante erstellen kann.

Objekte ja, aber nur von Objekten und nicht von Interfaces.

Zitat:

Zitat von xZise
Und es gibt die Methode .getClass() die gibt zwar kein String zurück, aber so richtig was anfangen kann ich damit auch nicht.

Die wird eine Class zurückgeben. Das ist ein Objekt aus der Reflektion. Darüber kannst Du dann neue Objekte erstellen oder Eigenschaften der jeweiligen Klasse abfragen. Bei einem Interface sollte die Class aber den Bauplan des Interfaces enthalten und nicht den der implementierenden Klasse. Und einfach "aus der Luft" ein neues Interface zu erstellen ist ja Blödsinn (und funktioniert auch nicht).

Gruß
xaromz

xZise 26. Jan 2010 13:20

Re: [Java] Neues Objekt vom anderen Objekt
 
Naja ich wollte ja nicht vom Interface was erstellen, dies sollte ja nur als „gemeinsamer“ Nenner dienen.

Damit wäre auch .getClass() wieder richtig, da ich die letzte Klasse von diesem Objekt haben wollte.

MfG
Fabian

Khabarakh 26. Jan 2010 17:22

Re: [Java] Neues Objekt vom anderen Objekt
 
Zitat:

Zitat von xZise
Aber im Laufe des Programms kann man ein Objekt halt nach einem Verfahren erstellen (es handelt sich um eine Graphklasse einmal als Adjazenzmatrix und einmal als -liste).

Dann fügst du eben noch ein GraphFactory-Interface mit Graph getNewGraph() hinzu ;) . In .NET würde das auch über Generics funktionieren, aber da die JVM keine besitzt...

Zitat:

Zitat von xaromz
Bei einem Interface sollte die Class aber den Bauplan des Interfaces enthalten und nicht den der implementierenden Klasse.

getClass sollte allerdings den Runtime-Typ zurückliefern, getClass().newInstance() dürfte also passen.

xaromz 26. Jan 2010 17:29

Re: [Java] Neues Objekt vom anderen Objekt
 
Hallo,
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von xaromz
Bei einem Interface sollte die Class aber den Bauplan des Interfaces enthalten und nicht den der implementierenden Klasse.

getClass sollte allerdings den Runtime-Typ zurückliefern, getClass().newInstance() dürfte also passen.

ich bin mir da nicht so sicher. Es ist ja getClass() des Interfaces und nicht des darunterliegenden Objekts.

Gruß
xaromz

Khabarakh 26. Jan 2010 18:29

Re: [Java] Neues Objekt vom anderen Objekt
 
Zitat:

Zitat von xaromz
ich bin mir da nicht so sicher. Es ist ja getClass() des Interfaces und nicht des darunterliegenden Objekts.

Weder noch, es ist Object.getClass ;) . Wie auch immer der Code darin aussieht, er kann schlecht wissen, ob die Variable, über die er aufgerufen wird, ein Interface oder eine Klasse ist. Der Compiletime-Typ geht beim Kompilieren verloren.

Zusätlich zu "Returns the runtime class of an object." gehe ich einfach mal davon aus, dass sich hier die JVM wie die CLR und wahrscheinlich alle anderen Plattformen verhält.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz