Vererbung änderung des Konstruktors

Bitte aktiviere JavaScript!
Guten Tag zusammen,

ich komme mal wieder bei einer Aufgabe nicht weiter :(
Wir haben eine Rational Klasse bekommen die ich etwas abgeändert habe aber um diese Klasse soll es hier nicht gehen. Es soll eine zweite Klasse geschrieben werden mit:
Geben Sie eine Unterklasse SignedRational an, die Brüche mit Vorzeichen
darstellen kann.
Hier die gegebene Klasse (wie gesagt etwas geändert):
Java:
class Rational {
    protected long num, denom;
   
    Rational(long num, long denom) {
        this.num = num;
        this.denom = denom;
    }
   
    Rational sum(Rational b) {
        long res1 = (num * b.denom) + (b.num * denom);
        long res2 = denom * b.denom;
        return new Rational(res1, res2);
    }
   
    long getDenom() {
        return denom;
    }
   
    long getNum() {
        return num;
    }
   
    String text() {
        if (getDenom() == 1)
        return "" + getNum();
        return getNum() + "/" + getDenom();
        }
}
und hier mein Versuch der SignedRational Klasse.
Mein Problem ist das ich nach dem Aufruf von super die Werte nicht mehr ändern kann :(

Java:
public class SignedRational extends Rational {
   
    SignedRational(int n, int d){
        super(n,d);
        if(d<0) {
            d=-d;
            n=-n;
        }
       
    }
   
}
Kann mir da jemand weiter Helfen?

LG
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Achso stimmt ja ich hab ja zugriff auf die Datenelemente über this! o_O gut das es euch gibt :) man man man!!!
Irgendwann muss man das ganze doch mal verstehen :( *kopfschüttel!*
Dank dir =)

Kann sein das hier noch ein paar mehr Fragen kommen zu der Aufgabe :D
LG
 
Der Zweite Teil der Aufgabe heißt:
Erweitern Sie Ihre Klasse SignedRational um eine Methode normalize() , die
den Zustand des Objektes so ändert, dass num und denom keine negativen
Werte enthalten.
Die Methode sieht bei mir so aus:
Java:
SignedRational normalize() {
        if(getNum()<0)
            num = -getNum();
        return this;
    }
Was mir nicht gefällt ist der Zugriff auf die Datenelement also hier num = . Kann man das ändern?
und der dritte Teil lautet:
Erweitern Sie Ihre Klasse SignedRational so, dass für zwei Brüche b1 und b2
mit Vorzeichen der Aufruf b1.sum(b2) die Summe von b1 und b2 als Ergebnis
zurückliefert.
Damit konnte ich nichts anfangen denn man kann doch einfach die sum Methode von Rational benutzen:
Java:
Rational sum(Rational b) {
        long res1 = (num * b.denom) + (b.num * denom);
        long res2 = denom * b.denom;
        return new Rational(res1,res2);
    }
Deswegen sieht die SignedRational Klasse wie folgt aus:
Java:
public class SignedRational extends Rational {
   
   
     SignedRational(int n, int d){   
        super(n,d);
        if(d<0) {
            denom=-d;
            num=-n;
        }
    }
   
    SignedRational normalize() {
        if(getNum()<0)
            num = -getNum();
        return this;
    }
   
    Rational sum(Rational b) {
        long res1 = (num * b.denom) + (b.num * denom);
        long res2 = denom * b.denom;
        return new Rational(res1,res2);
    }

}
 
Das mit dem Datenelement habe ich grade selbst hin bekommen :)
Java:
SignedRational normalize() {
        if(getNum()<0)
            setNum(-getNum());
        return this;
    }
Denn Setter habe ich in Rational gebaut sieht so aus:
Java:
    void setNum(long n) {
        num=n;
    }
 
Probier mal
Java:
SignedRational r1 = new SignedRational(1,1);
SignedRational r2 = new SignedRational(-1, 1);
r1.sum(r2).normalize();
 
mhhh... klar dann kommt das normalize() ja nicht definiert ist für Rational. Ist es ja auch nicht :D
Wie kann ich das ändern? Ich hab mir heute zwar die Vererbung nochmals angeschaut doch das Thema ist sehr umfangreich finde ich und es fällt mir jetzt nicht ein wie ich das ändern könnte.
Ich wollte es so machen das ich bei sum jeden Rational benutzen kann. Da es ja eh eine Redefinitione werden soll muss man den Methodenkopf nutzen und da steht ja auch Rational. Würde ein Typcast das Problem beseitigen?
LG
 
System.out.println(r1.sum(r2).normalize().text());
Ausgabe ist 0

Wenn ich die Methode aber Überlade nicht redefiniert!
Java:
SignedRational sum(Rational b) {
        long res1 = (num * b.denom) + (b.num * denom);
        long res2 = denom * b.denom;
        return new SignedRational(res1,res2);
    }
 
ich werde heute oder morgen das Thema zur Vererbung erneut durcharbeiten dann kann ich meine Frage vielleicht genauer stellen oder vielleicht sogar eine Lösung zeigen!
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben