Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
import java.util.*;
public class FigurenListe {
LinkedList figurenListe = new LinkedList();
public void figurAnfuegen(double breite,double laenge){
// add aus LinkedList überschreiben
Rechtecke r = new Rechtecke(breite,laenge);
figurenListe.add(r);
}
public void anzeigen(){
for (Iterator iter = figurenListe.iterator(); iter.hasNext();) {
System.out.println(iter.next());
}
}
}
Habe folgende Klasse geschrieben.Die methode figurAnfuegen fuegt ein Rechteck ein,das in einer anderen Klasse definiert ist. jetzt möchte ich die Liste,wo die Figurenobjekte eingefuegt werden, ausgeben.klappt nur nich so ganz :rtfm:
Was genau funktioniert nicht?
Bekommst du gar keine Ausgabe? Eine Ausgabe die du nicht erwartest?
Mit "klappt nur nicht so ganz" lässt sich nicht wirklich etwas anfangen.
du brauchst keinen iterator dazu, es reicht eine for schleife...so bekommst du aber nur das Rechteckobjekt, keine ahnung wie deine methoden zum ausgeben der attribute heißen...vllt r.getBreite();??
Ohne Generics sind in deiner LinkedList auch nur Objects drin. Ein Object hat keine deiner genannten Methoden.
Die .toString() Methode zu überschreiben sollte bereits helfen. Alternativ die Liste mit Generics anlegen oder (eher schlecht als recht) die Objekte zu einem Rechteck casten.
Mit einer for über den Index zu gehen (wie von jemand anderen Vorgeschlgen) würde ich bei einer LinkedListe jetzt aber nicht.
Deine LinkedList (besser gegen das Interface List implementieren) kann jetzt alle Rechtecke und alle Klassen die von Rechteck erben aufnehmen. Aber da ich mal davon ausgehe dass Kreis nicht von Rechteck erbt (hm, oder vllt ist nen Kreis einfach nur nen Rechteck mit unendlich vielen Kante? :rtfm:...) kannst du nur Rechtecke in die Liste aufnehmen.
Wenn du eine gemeinsame Oberklasse, z.b. GeometrischeForm, hättest könntest du schreiben:
Java:
List<GeometrischeForm> liste = new LinkedList<GeometrischeForm>();
Dann kannst du in die Liste Rechtecke, Kreise, Dreiecke etc. legen.
public class GeometrischeFormen {
public void anzeigen(){
}
}
public class Kreise extends GeometrischeFormen {
private double radius;
private double durchmesser;
private double umfang ;
private double flaeche;
public Kreise(double radius){
this.radius = radius;
durchmesser = 2* radius;
umfang = 3.14 * (2*radius);
flaeche = 3.14 * (radius*radius);
}
public double getDurchMesser(){
return durchmesser;
}
public double getUmfang(){
return umfang;
}
public double getFlaeche(){
return flaeche;
}
public double getRadius(){
return radius;
}
public void anzeigen(){
System.out.println("Radius : " + getRadius() + " Umfang: " + getUmfang() + " DurchMesser " + getDurchMesser() + " Flaeche: " + getFlaeche());
}
}
public class Rechtecke extends GeometrischeFormen {
double breite;
double laenge;
double flaeche;
double umfang;
public Rechtecke(double breite, double laenge){
this.breite = breite;
this.laenge = laenge;
umfang = 2*breite + 2*laenge;
flaeche = breite * laenge;
}
public double getBreite(){
return breite;
}
public double getLaenge(){
return laenge;
}
public double getFlaeche(){
return flaeche;
}
public double getUmfang(){
return umfang;
}
public void anzeigen(){
System.out.println("Breite : " + getBreite() + " Laenge: " + getLaenge() + " Flaeche " + getFlaeche() + " Umfang " + getUmfang());
}
}
import java.util.*;
public class FigurenListe {
LinkedList<GeometrischeFormen> figurenListe = new LinkedList<GeometrischeFormen>();
public void figurAnfuegen(GeometrischeFormen r){
figurenListe.add(r);
}
public void anzeigen(){
for(int i=0;i<figurenListe.size();i++){
System.out.println("Breite: " +figurenListe.get(i).....
}
}
}
1.Was kann ich denn z.b in Geometrische Formen deklarieren,damit sich eine Sinnvolle Vererbung ergibt?
2. Kann ich eine Methode schreiben, die egal von welchem Typ ein neues Objekt anlegt? D.h ein und dieselbe Methode, die einen Kreis anlegt, die ein Rechteck anlegt usw..? Oder muss ich seperate Methoden deklarieren? (Methode figurAnfuegen)
Zunächst mal würd ich die Klasse als abstract class deklarieren.
Dort kannst du dann alles implementieren was die Objekte gemeinsam haben. Z.b. Umfang und Flaeche (wobei man da überlegen könnte die Werte nicht übergeben zu lassen sondern jedesmal zu berechnen, dann würde die Berechnung allerdings wieder in die Unterklassen fliegen).
2. Kann ich eine Methode schreiben, die egal von welchem Typ ein neues Objekt anlegt? D.h ein und dieselbe Methode, die einen Kreis anlegt, die ein Rechteck anlegt usw..? Oder muss ich seperate Methoden deklarieren? (Methode figurAnfuegen)
Das könntest du erreichen indem du z.b. die Oberklasse zu nem Interface machst und dort ne Methode createNew() definierst, alle Unterklassen müssen die Methode implementieren und geben dann ein neues Objekt von sich zurück.
Oder die Oberklasse so lässt, dort die Methode createNew definierst und z.b. ne UnsupportedMethod exception wirfst wenn die Methode nicht überschrieben wurde.
public interface GeometrischeFormen {
public void anzeigen();
public GeometrischeFormen createNew();
}
public class Kreise implements GeometrischeFormen {
private double radius;
private double durchmesser;
private double flaeche;
private double umfang;
public Kreise createNew(){
Kreise k = new Kreise();
return k;
}
public void setRadius(){
this.radius = radius;
}
public void setDurchMesser(){
this.durchmesser = 2*radius;
}
..
import java.util.*;
public class FigurenListe {
LinkedList<GeometrischeFormen> figurenListe = new LinkedList<GeometrischeFormen>();
public void figurAnfuegen(){
}
}
Jetzt soll aber die Methode figurAnfuegen(); figurObjekte also GeometrischeFormen sozusagen anlegen..ich könnte ja jetzt jeweils ein Kreisobjekt oder ein Rechteckobjekt mit createNew() anlegen..aber wie kann ich das Allgemein machen? Bin so durcheinander .
Ich zeig einfach mal die Aufgabenstellung:
Die Klasse FigurenListe soll ein Attribut figurenListe vom Typ LinkedList
(Paket java.util) enthalten und die Methoden figurAnfuegen,
l. Mit Hilfe der Methode figurAnfuegen soll ein Figurenobjekt am Ende von figurenListe
eingefuegt werden.
in Kreise und Rechtecke also eine Methode createNew()
Java:
public GeometrischeFormen createNew(){
Kreise k = new Kreise();
return k;
}
Java:
Kreise+ Rechtecke von Geometrische Formen abgeleitet
public abstract class GeometrischeFormen {
public abstract void anzeigen();
public abstract GeometrischeFormen createNew();
und in Figurenliste dementsprechend eine methode figurAnfuegen:
Java:
import java.util.*;
public class FigurenListe {
LinkedList<GeometrischeFormen> figurenListe = new LinkedList<GeometrischeFormen>();
public void figurAnfuegen(GeometrischeFormen g){
figurenListe.add(g.createNew());
}
public static void main(String[] args) {
FigurenListe f1 = new FigurenListe();
f1.figurAnfuegen(new Kreise());
}
}
}
Ich kann jetzt aber das Kreis Objekt irgendwie nicht ansprechen..
Also zum einen Würd ich die Methode createNew() static machen, warum wollst du die auf ner Instanz aufrufen?!
Zum anderen brauchst du in deiner FigurenListe noch ne Methode die dir ein Objekt aus der Liste zurückgibt, oder wie wollst du sonst drauf zu greifen?
public static GeometrischeFormen createNew(){
Kreise k = new Kreise();
return k;
}
und
Java:
import java.util.*;
public class Testbett {
public static void main(String[] args) {
FigurenListe f1 = new FigurenListe();
f1.figurAnfuegen(Kreise.createNew());
}
}
aber wie geb ich ein Objekt der figurenListe zurück?
Ja sowas in der Richtung...
Allerdings beendet sich deine Methode direkt im ersten Schleifendurchlauf. Wenn du die ganze liste zurückgeben willst dann gib deine LinkedList zurück. Ich würd mir aber eher so eine Methode schreiben:
Java:
public GeometrischeForm get(int index) {
/** index prüfen */
return figurenListe.get(index);
}
ok aber wofür brauch ich die Methode?
mein Problem ist ja immer noch ein FigurenObjekt durch die Methode figurAnfuegen(GeometrischeFormen g) zu schreiben..
wenn ich das mache:
z.b
f1.figurAnfuegen(Kreise.createNew());
hab ich zwar mein Objekt der Klasse Kreis,kann damit aber nichts anfangen...
wobei setFlaeche eine Methode ist aus Kreise. Die Methode geht benötigt kann aber nur auf GeometrischeFormen zugreifen. (public GeometrischeFormen get.....)
Ja, weil du eine Liste von GeometrischeForm'en hast. Java kann ja nicht wissen welche Objekte du wirklich in die Liste legst.
Wenn du auf die Methoden der Unterklassen zugreifen willst musst du auf die entsprechende Klasse casten und vorher am besten per intanceof prüfen ob das auch klappt
versuch ich ja.nur es fällt mir nicht so leicht wie man sieht.
es tritt eine ClassCastException auf.
wäre es nicht sinnvoller einfach 2 überladene Methoden zu für figurAnfuegen zu schreiben?
Die Aufgabenstellung ist auch einfach mal wieder so unpräzise.:rtfm:
Zeig mal den Code bei dem du die Exception bekommst.
Die Exception kann z.b. auftreten wenn du nen Rechteck zu nem Kreis casten willst, das geht halt nicht