Vererbung Geometrie

mayra-leyn

Mitglied
Aufgabe 3: Geometrie 6 Punkte
Betrachten Sie die Klasse Figur:
Java:
public class Figur {
	private double pos_x;
	private double pos_y;
	public Figur(double pos_x, double pos_y) {
		this.pos_x = pos_x;
		this.pos_y = pos_y;
	}
	public double getPosX() {
		return this.pos_x;
	}
	public double getPosY() {
		return this.pos_y;
	}
// verschiebt die Figur um dx in x-Richtung und um dy in y-Richtung
	public void verschieben(double dx, double dy) {
		this.pos_x += dx;
		this.pos_y += dy;
	}
// gibt die Bezeichnung zurueck
	public String getType() {
		return "Figur";
	}
}
Implementieren Sie eine Klasse Rechteck und eine Klasse Kreis, die beide von der Klasse Figur erben
sollen.
Die Klasse Rechteck soll die Klasse Figur um folgende Attribute erweitern:
• laenge vom Typ double
• breite vom Typ double
und folgende Methoden haben:
• einen Konstruktor, der alle Attribute des Rechtecks initialisiert.
• eine Methode berechneFlaeche, die den Flächeninhalt berechnet und zurückgibt
(Flächeninhalt eines Rechtecks: Länge · Breite).
• eine Methode getType, die die gleichnamige Methode der Superklasse überschreibt.
Die Klasse Kreis soll die Klasse Figur um folgendes Attribut erweitern:
• radius vom Typ double
und folgende Methoden haben:
• einen Konstruktor, der alle Attribute des Kreis initialisiert.
• eine Methode berechneFlaeche, die den Flächeninhalt berechnet und zurückgibt
(Flächeninhalt eines Kreises: Pi · r^2).
• eine Methode getType, die die gleichnamige Methode der Superklasse überschreibt. Benutzen Sie für die Kreiszahl Pi in Java den Ausdruck Math.PI.
Implementieren Sie eine Klasse TestGeometrie, in dessen main-Methode Sie:
• von jeder der drei Klassen ein Objekt erzeugen.
• mindestens zwei Objekte verschieben.
• von mindestens zwei Objekten die Bezeichnung, die Position und wenn möglich den Flächeninhalt
auf der Konsole ausgeben.


Meine Subkassen lauten:
Java:
public class Rechteck extends Figur {
	double laenge;
	double breite;
	public Rechteck(double pos_x, double pos_y, double laenge, double breite){
		super(pos_x,pos_y);
		this.laenge=laenge;
		this.breite=breite;
	}
	public double berechneFlaeche(){
		return (laenge*breite);
	}
	public String getType() {
		return "Rechteck";
	}
}

und
Java:
public class Kreis extends Figur {
	double radius;
	public Kreis(double pos_x, double pos_y, double radius){
		super(pos_x,pos_y);
		this.radius=radius;
	}
	public double berechneFlaeche2(double radius){
		return (this.radius*this.radius*Math.PI);
	}
	public String getType() {
		return "Kreis";
	}
}

beide lassen sich auch compilieren.
Aber nicht meine Test-Datei:

Java:
public class TestGeometrie{
	public static void main (String[] args){
		Figur[] figuren=new Figur[3];
		figuren[0]=new Figur(2.0,3.0);
		figuren[1]=new Rechteck(3.6,2.6,1.1,4.7);
		figuren[2]=new Kreis(1.0,3.8,5.8);
		for (int i = 0 ; i <= 2; i++){
			System.out.println("Die erste Figur ist ein/e "+figuren[i].getType()+" und besitzt die Koordinaten ("+figuren[i].getPosX()+"/"+figuren[i].getPosY()+") und besitzt einen Flächeninhalt von "+figuren[1].berechneFlaeche());
		}
	}
}

Woran liegt es nur??

Herzlichen Dank schonmal, und erholsame vorlesungsfreie Tage, liebe Grüße, Franziska
 
G

Gast2

Gast
Das nächste mal dann gleich noch die Fehlermeldung mitkopieren, das machts allen einfacher die Fehler zu finden.

Java:
figuren[1].berechneFlaeche()
Du versuchst hier auf nen Objekt der Klasse Figur die Methode berechneFlaeche() aufzurufen. Die Klasse Figur stellt diese Methode aber nicht bereit.
 

GUI-Programmer

Top Contributor
Das nächste mal dann gleich noch die Fehlermeldung mitkopieren, das machts allen einfacher die Fehler zu finden.

Java:
figuren[1].berechneFlaeche()
Du versuchst hier auf nen Objekt der Klasse Figur die Methode berechneFlaeche() aufzurufen. Die Klasse Figur stellt diese Methode aber nicht bereit.

Daher sollte sowohl bei der Klasse Kreis als auch bei Rechteck die Methode zur Flächenberechnung so ausschauen:
Code:
public void berechneFlaeche() { ... }
.

In deiner Testklasse dann:
Java:
for (int i = 0 ; i <= 2; i++){
    System.out.println("Die erste Figur ist ein/e "+figuren[i].getType()+" und besitzt die Koordinaten ("+figuren[i].getPosX()+"/"+figuren[i].getPosY()+") und besitzt einen Flächeninhalt von ");
    if(figuren[i] instanceof Kreis) {
        Kreis k = (Kreis) figuren[i];
        System.out.print(k.berechneFlaeche());
    } else if(figuren[i] instanceof Rechteck) {
        Rechteck r = (Rechteck) figuren[i];
        System.out.print(r.berechneFlaeche());
    }
}

Was allerdings noch besser wäre, wahrscheinlich aber nicht erlaubt ist, der Klasse Figur die berechneFlaeche() - Methode geben, dann könntest du deinen 1. Ansatz umsetzen.
 
G

Gast2

Gast
Also die instanceof Variante finde ich nicht schön..
Vergiss einfach das Figur-Array, es wird in der Aufgabenstellung nirgends gefordert, dass du deine Objekte in ein Array packst. Erstell die Objekte einfach so:
Java:
Kreis k = new Kreis(...);
...
Dann hast du zugriff auf alle Methoden und musst dich nicht mit so nem Käse rumschlagen.
 

GUI-Programmer

Top Contributor
Also die instanceof Variante finde ich nicht schön..
Vergiss einfach das Figur-Array, es wird in der Aufgabenstellung nirgends gefordert, dass du deine Objekte in ein Array packst. Erstell die Objekte einfach so:
Java:
Kreis k = new Kreis(...);
...
Dann hast du zugriff auf alle Methoden und musst dich nicht mit so nem Käse rumschlagen.

Stimmt. Am Allereinfachsten habe ich natürlich wieder mal nicht gedacht!
 

mayra-leyn

Mitglied
Vielen, vielen Dank! Ihr ward mir eine große Hilfe. Ich habe mich die ganze Zeit gefragt, warum der Computer meint, dass es sich um die Klasse Figur handelt, weil ich die Methode ja in der Klasse Kreis bzw. Rechteck erstellt habe, aber nun ists mir klar geworden, dass ich ja Objekte in der Klasse Figur erstellt habe.
Vielen Dank für die schnellen Antworten!
 

Ähnliche Java Themen

Neue Themen


Oben