Klassen Methoden anderer Klassen aufrufen

Nothing00

Neues Mitglied
Hallo,

ich hänge hier bei einer Aufgaben und würde mich über Euren Rat freuen. Es geht um geometrische Figuren. Ich möchte eine Methoden aus einer anderen Klasse aufrufen. Alle Klassen sind Public.

Hier eine UML-Übersicht:

In Klasse Quader möchte ich nun eine Methode ("diagonalenLaenge") aus der Klasse Rechteck aufrufen.
Meine unbeholfenen Versuche über Get haben bisher nicht funktioniert. Wie kann dies, am besten noch elegant, gehen? Über eine Rat wäre ich sehr dankbar.

Gruss

Nothing00
Java:
package geometrie;

public class Rechteck extends Figur2D {

    //Attribute
    private int breite, laenge; //Breite in y-Richtung, Länge in x-Richtung
    private double hypothenuse; //Hypothenuse als Attribut deklariert für die Berechnung der Quader
           
    //Methoden
    public Rechteck (Punkt bezug, int b, int l)// Konstruktor
    //Verwendung von bezug, siehe Klasse Punkt.
    {
        super(bezug);
        this.breite = b; assert b >= 1;
        this.laenge = l; assert l >= 1;
    }
   
    public Rechteck() {}
   
    public Rechteck (Punkt bezug, int b, int l, double hL)// Konstruktor
    //Verwendung von bezug, siehe Klasse Punkt.
    {
        super(bezug);
        this.breite = b; assert b >= 1;
        this.laenge = l; assert l >= 1;
        this.hypothenuse = diagonalenLaenge(laenge, breite) ;
    }
   
    //Zugriffsmethoden
    public int getBreite()
    {
        return breite;
    }
    public void setBreite(int neueBreite)
    {
        assert neueBreite >= 1; //Zusicherung
    }
    public int getLaenge()
    {
            return laenge;
    }
    public void setLaenge(int neueLaenge)
    {
        assert neueLaenge >= 1; //Zusicherung
    }
     
    public double diagonalenLaenge(int l, int b)
    {
        return (Math.sqrt(Math.pow(laenge, 2) + Math.pow(breite, 2)));
    }
   
    public double getHypothenuse(int l, int b)
    {
        return hypothenuse;
    }
       
  //geerbte Methoden definiert im Rumpf ohne abstract
    public double umfang()
    {
        return 2 * breite + 2 * laenge;//siehe Seite 224 oder Video 06 OOP2 32:00 oder Class Rechteck
    }
    public double flaeche()
    {
        return breite * laenge;
    }
     
}

package geometrie;

public class Quader extends Figur3D {

    //Attribute
    private int hoehe;
    //private double diagonalenLaenge;
       
    //Methoden
   
    public Quader(Rechteck r, int hoehe)//konstruktor
    {
        super(r);
        this.hoehe = hoehe;
    }
   
    public Quader()
    {}
   
    /*public Quader(Rechteck r, int hoehe, double diagonalenLaenge)//meins
    {
        super(r);
        this.hoehe = hoehe;
    }*/
   
    //Zugriffsmethoden
    public Figur2D getBoden()
    {
        return super.getBoden();
    }
    public void setBoden(Figur2D boden)
    {
        super.setBoden(boden);
    }  
       
    public int getHoehe()
    {
        return hoehe;
    }
    public void setHoehe(int neueHoehe)
    {
        assert neueHoehe >= 1; //Zusicherung
    }
       
    public double laengeRaumdiagonale()
    {
        getHypothenuse() instanceof Rechteck; //?????????????????????
        return Math.sqrt(Math.PI * Math.pow(getLaenge()), 2) + Math.pow(h, 2)); //???????????
    }
   
}
}
 
Wenn Du das KLassendiagramm implementierst, dann darfst Du nur das Klassendiagramm implementieren. Wenn da keine Hypothenuse ist, dann ist da keine (im Rechteck!). Ansonsten wäre die Umsetzung eben nicht die des Klassendiagramms.

Du hast in der Figur3D ja eine Figur2D (boden). Der Quader kann da ja das Rechteck speichern. Damit hast Du da alle Methoden von Rechteck. Und da hast Du länge und Breite - und damit kannst Du da die raumdiagonale berechnen. Dazu niummst Du Dir den Boden und machst da einen Cast zu einem Rechteck.
 
Das übliche Verständnisproblem / Begriffsproblem.
Abgesehen von static-Methoden ruft man keine Methoden in anderen Klassen auf, sondern die Methoden von anderen Objekten.

dasEineSpezifischeRechteck.getDiagonale();

... und so ist es im Klassendiagramm auch abgebildet.

Deine Methode allerdings erwartet Eingangsparameter, was sie nicht soll.
 
Hallo,

vielen Dank schon mal für Eure Hinweise. Mittlerweile bin ich schon deutlich weiter, die Klasse Quader ist fast fertig.
Momentan hänge ich noch bei der Verwendung einer statischen Methode in der ich nicht auf die Instanzvariable des Objektes zugreifen kann.

Wie kann ich denn die Methode auf dem Objekt ausführen? Irgendwie hänge ich hier.

Java:
    public double laengeRaumdiagonale()
    {
        Rechteck recht;
        int laenge, breite;
        recht = getBoden();
        laenge = recht.getLaenge();
        breite = recht.getBreite();
        return Math.sqrt(Math.pow(laenge, 2) + Math.pow(breite, 2) + Math.pow(hoehe, 2));
    }
    public static boolean istWuerfel(Object o)
    {
        Rechteck recht;
        int laenge, breite;
        recht = ((Quader) o).getBoden();
        laenge = recht.getLaenge();
        breite = recht.getBreite();
        if ((recht.getLaenge() + recht.getBreite() + hoehe) / 3 == hoehe) // Wie geht dies???
            return true;
        else
            return false;
    }
 
Vorweg: istWuerfel sollte kein Objekt der Klasse 'Object' erwarten, sondern ein Objekt der Klasse 'Quader'. Falls was anderes übergeben wird als ein Quader, gibt's eine ClassCastException zur Laufzeit und das willst du sicher nicht.

Statischer Zugriff vs Instanzmethode:
Java:
public class AClass {
    /**
     * Die Methode kann natürlich auch Parameter erwarten.
     */
    public void instanceMethod() {
        ...
    }
    public static void staticMethod(Quader b) {
        ...
    }
}

//Aufruf
public class MainClass {
    public static void main(String ...) {
        //Aufruf einer statischen Methode in AClass
        Quader b1 = new Quader();
        AClass.staticMethod(b1);
        //Aufruf einer AClass-Instanzmethode.
        AClassObject acO = new AClass();
        acO.instanceMethod();
    }
}

Wenn etwas ein Objekt ist (ein Rechteck z.B.), dann hat es gewisse Eigenschaften. Diese Eigenschaften sind über Instanzmethoden zugänglich.
Wenn ein Objekt von jemand anderem behandelt oder ausgewertet werden soll, dann übergibt man es als Parameter an die entsprechende Methode. Ob diese nun statisch ist oder nicht, hängt wiederum davon ab, ob sie zu einem Objekt gehört oder nicht.

Deine Methode istWuerfel erwartet einen Parameter ... wieso? Soll sie die Eigenschaft des aktuellen Quaders auswerten oder die eines anderen?
Falls Ersteres, dann nimm den Parameter weg, der aktuelle Quader ist "this".
Falls Letzteres, dann sollte sie static sein und kann auch woanders als in der Klasse Quader gespeichert sein.

Es gibt hier eben 2 Ansätze, wie man's machen kann:
1. Eigenschaft eines Objekts
Code:
meinQuader.istWuerfel():
2. Auswertung von außen:
Code:
MeineSammlungAnAuswertungsMethoden.istWuerfel(meinQuader);

Schau dir mal die Klasse java.lang.Math an, das sind alles statische Methoden, hier wäre es unsinnig, eine Instanz von Math zu verwenden.
Anders z.B. die Methode toCharArray() in einem String. Das ist eine Instanzmethode eines Strings.


Es gibt im Grunde wirklich nur diese beiden Vorgehensweisen, du musst nur entscheiden, ob deine Methode ein Werkzeug von außen ist oder eine Eigenschaft eines Objekts (egal, ob nun set/get/modify/eval). Daraus ergibt sich das Design.
 

Neue Themen


Zurück
Oben