Wenn der Compiler intelligent waere, dann wurde es wohl ohne diese expliziten Casts gehen. Aber das koennen Compiler nicht.
Sowas ist IMHO auch nicht die Aufgabe des Compilers, sondern der statischen Codeanalyse, falls vorhanden. Wenn entsprechende Tools mitlaufen, bekäme man ohne vorherige Abfrage bei dem Cast eine Warnung "Possible ClassCastException", mit der if-Abfrage jedoch nicht.
ich bin auf noch ein Problem gestossen, das eventuell etwas mit "instanceof" zu tun hat. Daher schreibe ich einfach mal in diesem Thread weiter.
Es geht um folgendes:
Ich habe drei Klassen A, B und C.
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
1 2 3 4 5 6 7 8 9 10 11 12 13
public abstract class A {
//...
}
public class B extends A {
//.. public int eineVariable;
}
public class C extends A {
//.. public int andereVariable;
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
public abstract class A {
//...
}
public class B extends A {
//.. public int eineVariable;
}
public class C extends A {
//.. public int andereVariable;
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
public abstract class A {
//...
}
public class B extends A {
//.. public int eineVariable;
}
public class C extends A {
//.. public int andereVariable;
}
Jetzt habe ich eine komplett unabhängige Methode, die außerhalb aller Klassen liegt. Diese Methode bekommt als Parameter eine Instanz der Klasse A.
Code:
public void machWas(A myInstanz) {
//...
}
Code:
public void machWas(A myInstanz) {
//...
}
Code:
public void machWas(A myInstanz) {
//...
}
Jetzt habe ich folgendes Problem. Wenn es sich bei "myInstanz" um ein Objekt der Klasse B handelt, so möchte ich den Wert von "eineVariable" ausgeben. Wenn "myInstanz" jedoch ein Objekt von C ist, so möchte ich "andereVariable" ausgeben.
Wie mache ich das?
Ich danke euch
lg, freakC++
_________________ Gdzie jest mój pstrąg?
Zuletzt bearbeitet von freakC++ am 16:57:48 11.01.2012, insgesamt 1-mal bearbeitet
public class B extends A {
//.. public int eineVariable;
}
public class C extends A {
//.. public int andereVariable;
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
public abstract class A {
//...
}
public class B extends A {
//.. public int eineVariable;
}
public class C extends A {
//.. public int andereVariable;
}
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
public abstract class A {
//...
}
public class B extends A {
//.. public int eineVariable;
}
public class C extends A {
//.. public int andereVariable;
}
Jetzt habe ich eine komplett unabhängige Methode, die außerhalb aller Klassen liegt. Diese Methode bekommt als Parameter eine Instanz der Klasse A.
Code:
public void machWas(A myInstanz) {
//...
}
Code:
public void machWas(A myInstanz) {
//...
}
Code:
public void machWas(A myInstanz) {
//...
}
Jetzt habe ich folgendes Problem. Wenn es sich bei "myInstanz" um ein Objekt der Klasse B handelt, so möchte ich den Wert von "eineVariable" ausgeben. Wenn "myInstanz" jedoch ein Objekt von C ist, so möchte ich "andereVariable" ausgeben.
Wie mache ich das?
Kannst es natürlich mit instanceof lösen:
Java Code:
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
public void machWas(A myInstanz) {
if(myInstanz instanceof B) {
int wert = ((B) myInstanz).eineVariable;
} else if(myInstanz instanceof C) {
int wert = ((C) myInstanz).andereVariable;
}
// irgendwas mit wert
}
Java Code:
1 2 3 4 5 6 7 8 9
public void machWas(A myInstanz) {
if(myInstanz instanceof B) {
int wert = ((B) myInstanz).eineVariable;
} else if(myInstanz instanceof C) {
int wert = ((C) myInstanz).andereVariable;
}
// irgendwas mit wert
}
Java Code:
1 2 3 4 5 6 7 8 9
public void machWas(A myInstanz) {
if(myInstanz instanceof B) {
int wert = ((B) myInstanz).eineVariable;
} else if(myInstanz instanceof C) {
int wert = ((C) myInstanz).andereVariable;
}
// irgendwas mit wert
}
Schöner wäre es, die Methode zu überladen.
Java Code:
1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9 10 11
public void machWas(B myInstanz) {
irgendwasMitWert(myInstanz.eineVariable);
}
public void machWas(C myInstanz) {
irgendwasMitWert(myInstanz.andereVariable);
}
public void irgendwasMitWert(int wert) {
// ...
}
Java Code:
1 2 3 4 5 6 7 8 9 10 11
public void machWas(B myInstanz) {
irgendwasMitWert(myInstanz.eineVariable);
}
public void machWas(C myInstanz) {
irgendwasMitWert(myInstanz.andereVariable);
}
public void irgendwasMitWert(int wert) {
// ...
}
Java Code:
1 2 3 4 5 6 7 8 9 10 11
public void machWas(B myInstanz) {
irgendwasMitWert(myInstanz.eineVariable);
}
public void machWas(C myInstanz) {
irgendwasMitWert(myInstanz.andereVariable);
}
public void irgendwasMitWert(int wert) {
// ...
}
Eventuell wäre das aber auch ein Zeitpunkt, dein Design zu überdenken.
Das würde aber bedeuten, dass ich alle meine Klassen kennen muss, um diese if Abfrage zu erstellen. Was ist aber wenn ich 100 Klassen habe, die von A erben und jeweils eigene Attribute haben?
Das würde aber bedeuten, dass ich alle meine Klassen kennen muss, um diese if Abfrage zu erstellen. Was ist aber wenn ich 100 Klassen habe, die von A erben und jeweils eigene Attribute haben?
Kann man das auch schöner lösen?
Danke dir
Dann ist es an der Zeit ein neues Design zu suchen.
Kommt etwas darauf an was du genau machen moechtest. Aber eventuell waere es nicht schlecht eine abstrakte Methode in der Basisklasse zu deklarieren und diese in den Subklassen zu ueberladen.
Oder sich ueberlegen ob diese einzelnen Klassen ueberhaupt eine sinnvolle gemeinsame Basisklasse besitzten.
*Edit
Was moechtest du denn konkret haben?
Zuletzt bearbeitet von icarus2 am 17:16:51 11.01.2012, insgesamt 1-mal bearbeitet
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.