B
backbone
Gast
hallo!
ich habe ein problem bei der implementierung eines interfaces.
hier die genaue beschreibung:
ich habe eine Klasse Matrix, welche eine vielfältige anzahl an funktionen für matrizen über einen Körper (Zahlen, Polynome etc.) bereitstellt.
die matrix elemente werden in einer objektvariable der klasse gespeichert. die variable ist 2 dimensional und vom typ Body.
Body ist ein Interface, welches grundlegende eigenschaften von körpern beschreibt wie addition, multiplikation etc.
Konkret sieht das so aus:
nun gibt kann die Matrix mit all den Objekten einer Klasse gefüllt werden, welche dieses Body-interface implementieren. für die reellen zahlen hab ich dazu eine Klasse realNum geschrieben.
das problem dabei ist das Addend ebenfalls vom typ Body ist (was natürlich ja auch so sein muss, da es im interface so deklariert wurde). jedoch kennt der datentyp Body nicht die Objektvariable Num nich, sodass Addend.Num nen dicken Fehler ergibt.
eine lösung des problems wäre in dem interface Body eine Methode getNum() zu deklarieren, welche Num des Objekts zurück gibt.
hier gibt es allerdings dann einen fehler in bezug auf die implementierung in anderen Körpern.
zum bsp. der körper der polynome. hier könnte man schlecht eine getNum() methode implementieren, da es ja mehrere signifikante zahlen in einem polynom gibt.
eine weitere lösung welche keine probleme bei anderen körpern hervorruft ist die nutzung der Methode toString(). Da ja alle mathematischen Körpern aus der realen welt kommen gibt es immer eine entsprechende notation.
bei reellen zahlen wäre dies zum beispiel: 65293.1235876e23
bei polynomen: 52x^2+41x-2
so müsste man dann einfach einen parser schreiben der den string in den gewünschten datentyp auf den der körper operiert umwandelt.
bei reellen zahlen: aus dem String "3961.241e12" wird dann eine entsprechende variable vom typ BigDecimal (auf den eben meine Klasse realNum operiert)
bei polynomen: "52x^2+41x-2" wird dann ein zum beispiel ein BigDecimal-Array mit den Koeffizienten des polynoms.
hier leidet aber dann deutlich die performance, da es ja eigentlich unnötig ist den inhalt eines elements eines körper in einen string zu verwandeln und dann wieder zurück. und außerdem können körper nur elemente von ihnen selbst addieren, multiplizieren, ...
man kann zum beispiel nich ein polynom mit einer reellen zahl multiplizieren (schon aber dann muss aus der reellen zahl erst ein polynom nullten grades gemacht werden)
gibt es hierzu eine lösung, bei der die performance nicht dermaßen leidet.
danke schon mal
cya
ich habe ein problem bei der implementierung eines interfaces.
hier die genaue beschreibung:
ich habe eine Klasse Matrix, welche eine vielfältige anzahl an funktionen für matrizen über einen Körper (Zahlen, Polynome etc.) bereitstellt.
die matrix elemente werden in einer objektvariable der klasse gespeichert. die variable ist 2 dimensional und vom typ Body.
Body ist ein Interface, welches grundlegende eigenschaften von körpern beschreibt wie addition, multiplikation etc.
Konkret sieht das so aus:
Code:
public interface Body
{
public Body add(Body Addend);
public Body multiply(Body Multiplicator);
public Body subtract(Body Subtrahend);
public Body divide(Body Divisor);
public Body negate();
public Body pow(int power);
public int scale();
public Body setScale(int scale);
public String toString();
public Body ZERO();
}
nun gibt kann die Matrix mit all den Objekten einer Klasse gefüllt werden, welche dieses Body-interface implementieren. für die reellen zahlen hab ich dazu eine Klasse realNum geschrieben.
Code:
public class realNum
implements Body
{
private BigDecimal Num;
private int scale;
...
//Konstruktoren
...
public Body add(Body Addend)
{
return new realNum(Num.add(Addend.Num), scale);
}
...
//alle anderen funktionen des intefaces
...
}
das problem dabei ist das Addend ebenfalls vom typ Body ist (was natürlich ja auch so sein muss, da es im interface so deklariert wurde). jedoch kennt der datentyp Body nicht die Objektvariable Num nich, sodass Addend.Num nen dicken Fehler ergibt.
eine lösung des problems wäre in dem interface Body eine Methode getNum() zu deklarieren, welche Num des Objekts zurück gibt.
hier gibt es allerdings dann einen fehler in bezug auf die implementierung in anderen Körpern.
zum bsp. der körper der polynome. hier könnte man schlecht eine getNum() methode implementieren, da es ja mehrere signifikante zahlen in einem polynom gibt.
eine weitere lösung welche keine probleme bei anderen körpern hervorruft ist die nutzung der Methode toString(). Da ja alle mathematischen Körpern aus der realen welt kommen gibt es immer eine entsprechende notation.
bei reellen zahlen wäre dies zum beispiel: 65293.1235876e23
bei polynomen: 52x^2+41x-2
so müsste man dann einfach einen parser schreiben der den string in den gewünschten datentyp auf den der körper operiert umwandelt.
bei reellen zahlen: aus dem String "3961.241e12" wird dann eine entsprechende variable vom typ BigDecimal (auf den eben meine Klasse realNum operiert)
bei polynomen: "52x^2+41x-2" wird dann ein zum beispiel ein BigDecimal-Array mit den Koeffizienten des polynoms.
hier leidet aber dann deutlich die performance, da es ja eigentlich unnötig ist den inhalt eines elements eines körper in einen string zu verwandeln und dann wieder zurück. und außerdem können körper nur elemente von ihnen selbst addieren, multiplizieren, ...
man kann zum beispiel nich ein polynom mit einer reellen zahl multiplizieren (schon aber dann muss aus der reellen zahl erst ein polynom nullten grades gemacht werden)
gibt es hierzu eine lösung, bei der die performance nicht dermaßen leidet.
danke schon mal
cya