Klassen Objekt mit einem Namen von einer bestimmten Klasse instanziieren

KeinUsername

Mitglied
Hallo,

ich versuche gerade folgende Funktionalität zu implementieren, komme aber nicht weiter, da der Compiler nicht will, wie ich will ;(

Ich habe insgesamt drei Klassen Standard, Extended und Start.
In der Klasse Start befindet sich die main Methode, die die Interaktion über die Konsole ermöglicht.

Nun will ich zu Beginn vom User wissen, ob er mit den Methoden der Klasse Standard oder den Methoden der Klasse Extended arbeiten möchte. Je nachdem instanziiere ich ein Objekt einer der beiden Klassen:

Java:
[code]if(auswahl == 1)
Code:
Extended objekt = new Extended();
Code:
else
Code:
Standard objekt = new Standard();

Danach wird genau derselbe Code ausgeführt, z.B.
Java:
objekt.methodeA();
jedoch mit einem anderen Ergebnis, da die Funktionalität in den beiden Klassen unterschiedlich umgesetzt wurde.

Nun meine Frage: Warum klappt das nicht? Warum kann ich nicht ein Objekt namens objekt von der einen bzw. anderen Klasse erstellen? Kann ich im Verlaufe des Programms irgendwie erreichen, dass mein Objekt namens objekt durch ein Objekt der anderen Klasse mit demselben Namen ersetzt wird?

Vielen Dank im Voraus!
 
mal davon abgesehen das bei

Java:
if(boolean)
{
	<T> object=new <T>();
}
else
{
	<T> object=new <T>();
}

die objektvariable außerhalb des if/else blocks garnicht verfügbar ist wäre das einfachste wohl gegen ein interface zu arbeiten
 
mal davon abgesehen das bei

Java:
if(boolean)
{
	<T> object=new <T>();
}
else
{
	<T> object=new <T>();
}

die objektvariable außerhalb des if/else blocks garnicht verfügbar ist wäre das einfachste wohl gegen ein interface zu arbeiten
Da ich annehme, dass der TE grade eine Aufgabe von einem Javakurs oder ähnliches bearbeitet nehme ich sogar an, dass die beiden Klassen entweder ein Interface implementieren oder von einer anderen Klasse abstammen.
 
naja ... so lange er es nicht sagt muss man erstmal davon ausgehen das es nicht so ist

war aber auch nicht sinn meines posts ... ich wollte lediglich anmerken das wenn man

Java:
<T> object=new <T>();

in irgend einen block steckt die variable außerhalb nicht mehr verfügbar ist ... und durch die konkrete typ-angabe auch globale variablen verdeckt *thema : variablen shadowing*
 
Die beiden Klassen haben jeweils 300 Zeilen und ich denke nicht, dass es an ihnen liegt. Wenn du sie dennoch sehen möchtest, kann ich sie hier posten.

Es sind im Grunde genommen nur zwei Klassen Standard und Extended die ein und dasselbe Interface implementieren, jedoch auf unterschiedliche Art und Weise (beide besitzen genau dieselben Methoden und alles).

Das Problem liegt nur darin, dass der Compiler in Eclipse nicht zulässt, dass ich in meiner if-Verzweigung entweder ein Objekt Standard objekt oder ein Objekt Extended objekt erzeuge, da die beiden denselben Namen haben (aber niemals beide erzeugt werden würden).
 
Das Problem liegt nur darin, dass der Compiler in Eclipse nicht zulässt, dass ich in meiner if-Verzweigung entweder ein Objekt Standard objekt oder ein Objekt Extended objekt erzeuge, da die beiden denselben Namen haben (aber niemals beide erzeugt werden würden).

Das wage ich zu bezweifeln.




Dann mach es doch so:

Java:
Interface object;
if(auswahl == 1){
    objekt = new Extended();
}else{
    objekt = new Standard();
}
object.doanything();


Anstatt "Interface" musst du natürlich den Namen des Interfaces einsetzen.
 
mal davon abgesehen das bei

Java:
if(boolean)
{
	<T> object=new <T>();
}
else
{
	<T> object=new <T>();
}

die objektvariable außerhalb des if/else blocks garnicht verfügbar ist wäre das einfachste wohl gegen ein interface zu arbeiten

Danke! Nun weiß ich wenigstens warum das so nicht klappt. Wusste nicht, dass das Objekt in diesem Falle nur innerhalb der Verzweigung verfügbar ist.

Und in der Tat bearbeite ich gerade eine Übungsaufgabe wie ihr schon vermutet habt. Jetzt weiß ich warum es nicht klappt aber wie könnte ich denn das was ich eigentlich will implementieren?

Ich könnte zwar zwei verschiedene Objekte erzeugen und die ganze main Methode einmal für objekt1 und für objekt2 kopieren, das wäre aber eine total übertriebene Redundanz und ich bin mir sicher, dass es auch anders gehen muss.
 
Danke! Nun weiß ich wenigstens warum das so nicht klappt. Wusste nicht, dass das Objekt in diesem Falle nur innerhalb der Verzweigung verfügbar ist.

Und in der Tat bearbeite ich gerade eine Übungsaufgabe wie ihr schon vermutet habt. Jetzt weiß ich warum es nicht klappt aber wie könnte ich denn das was ich eigentlich will implementieren?

Ich könnte zwar zwei verschiedene Objekte erzeugen und die ganze main Methode einmal für objekt1 und für objekt2 kopieren, das wäre aber eine total übertriebene Redundanz und ich bin mir sicher, dass es auch anders gehen muss.

Siehe meinen letzten Post...
 
Das wage ich zu bezweifeln.




Dann mach es doch so:

Java:
Interface object;
if(auswahl == 1){
    objekt = new Extended();
}else{
    objekt = new Standard();
}
object.doanything();


Anstatt "Interface" musst du natürlich den Namen des Interfaces einsetzen.

Vielen Dank, das hat mein Problem gelöst. Kannst du mir erklären warum es nicht geht wenn ich das Objekt entweder von der einen oder der anderen Klasse instanziieren will? Ich meine die beiden Klassen implementieren doch dasselbe Interface.
 
Das problem ist, dass du die Variablen INNERHALB der if definieren musst, diese aber NACH der if nichtmehr zur verfügung stehen

Java:
{
    {
        {
            int a = 1;
        } //int wird mit beendigung des Codeblocks vernichtet
     //int ist also hier schon nichtmehr verfügbar
    }
}
Keine Variable kommt aus einem Codeblock raus. Eine Variable die innerhalb eines Codeblocks definiert wurde, wird vernichtet sobald der Codeblock zuende geht (also auch das ende der if).

Somit muss die Variable schon VOR dem if definiert werden, und innerhalb nurnoch gefüllt werden.
Und da du 2 verschiedene Klassen Instanzierst (Extendet passt nicht in Standart, Standart passt nicht in Extendet) musst du als Datentyp einen gemeinsamen, also das gemeinsame Interface wählen.
 

Zurück
Oben