Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Java ::  Problem mit instanceof  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
LordJaxom
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.11.2005
Beiträge: 5553
Beitrag LordJaxom Mitglied 13:52:57 11.01.2012   Titel:              Zitieren

icarus2 schrieb:
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.
freakC++
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.04.2008
Beiträge: 1747
Beitrag freakC++ Mitglied 16:56:53 11.01.2012   Titel:              Zitieren

Hallo zusammen,

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 :D
lg, freakC++

_________________
Gdzie jest mój pstrąg?


Zuletzt bearbeitet von freakC++ am 16:57:48 11.01.2012, insgesamt 1-mal bearbeitet
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1163
Beitrag icarus2 Mitglied 17:11:27 11.01.2012   Titel:              Zitieren

Ungefaehr so:
Java Code:
if (myIntance instanceof B) {
     // Mach etwas
}
else if (myInstance instanceof C) {
     // Mach etwas
}
Java Code:
if (myIntance instanceof B) {
// Mach etwas
}
else if (myInstance instanceof C) {
// Mach etwas
}
Java Code:
if (myIntance instanceof B) {
     // Mach etwas
}
else if (myInstance instanceof C) {
     // Mach etwas
}
_kermit
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.01.2011
Beiträge: 74
Beitrag _kermit Mitglied 17:11:41 11.01.2012   Titel:              Zitieren

freakC++ schrieb:

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?


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.
freakC++
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.04.2008
Beiträge: 1747
Beitrag freakC++ Mitglied 17:13:13 11.01.2012   Titel:              Zitieren

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

_________________
Gdzie jest mój pstrąg?
icarus2
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.09.2009
Beiträge: 1163
Beitrag icarus2 Mitglied 17:16:12 11.01.2012   Titel:              Zitieren

freakC++ schrieb:
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
LordJaxom
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.11.2005
Beiträge: 5553
Beitrag LordJaxom Mitglied 17:47:45 11.01.2012   Titel:              Zitieren

Spendiere A eine abstrakte Methode "getVariable" und gib in den abgeleiteten Klassen den passenden Wert zurück.
C/C++ Forum :: Java ::  Problem mit instanceof  
Gehen Sie zu Seite Zurück  1, 2
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

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.