Arithmetische Ausdrücke

JavaIsTheBest

Bekanntes Mitglied
Hallo,
ich hätte ein paar Fragen zu folgender Aufgabe.

1. Warum kann ich die Methode oper() in der Klasse AbstractBinary aufrufen, obwohl die Methode in der Unterklasse Div implementiert ist? Ich kenne das so, dass die Oberklasse keine Methoden von der Unterklasse kennt. Oder liege ich da falsch?

2. Könntet ihr mir die Methode compute() erklären? Die Methode ist glaube ich rekursiv implementiert.
 

Anhänge

  • 04.png
    04.png
    319,6 KB · Aufrufe: 25

mrBrown

Super-Moderator
Mitarbeiter
schau mal Dein Diagramm an ...
"oper()" kommt doch aus dem Interface "Complex" und wird dann in "AbstractBinary" überschrieben !!
Wird erst in Div, Mul etc überschrieben ;)


1. Warum kann ich die Methode oper() in der Klasse AbstractBinary aufrufen, obwohl die Methode in der Unterklasse Div implementiert ist? Ich kenne das so, dass die Oberklasse keine Methoden von der Unterklasse kennt. Oder liege ich da falsch?

Die Methode kommt wie schon gesagt aus dem Interface, jedes Objekt vom Typ AbstractBinary besitzt also diese Methode, auch wenn sie in AbstractBinary nur deklariert, aber nicht implementiert ist. Implementiert wird sie dann in allen nicht-abstrakten Klassen, die AbstractBinary extenden.
Da sie in jeder Implementation von AbstractBinary existiert, kann sie in AbstractBinary auch aufgerufen werden.

2. Könntet ihr mir die Methode compute() erklären? Die Methode ist glaube ich rekursiv implementiert.

Um den aktuellen Ausdruck auszuwerten, benötigt man alle Teilausdrücke. Div zB besteht aus dem rechten und linken, diese können ja wieder irgendeine Rechnung sein, also muss man erst sie ausrechnen, und kann dann das Ergebnis von Div berechnen.
Stell dir sowas vor:
Code:
(1+2)/(3-2)[/icode]. Um die Division zu berochenen, müssen erst die Addition Subtraktion berechnet werden, also left.compute und right.compute. Für die Addition[code](1+2)[/icode]
muss dann wieder erst der rechte und linke Wert berechnet werden (in diesem Fall trivial, aber die Addition 'weiß' nicht, ob das schon ein Wert, oder eine Rechnung ist. also muss das wieder über #compute gemacht werden.
 

JavaIsTheBest

Bekanntes Mitglied
Die Methode kommt wie schon gesagt aus dem Interface, jedes Objekt vom Typ AbstractBinary besitzt also diese Methode, auch wenn sie in AbstractBinary nur deklariert, aber nicht implementiert ist. Implementiert wird sie dann in allen nicht-abstrakten Klassen, die AbstractBinary extenden.
Da sie in jeder Implementation von AbstractBinary existiert, kann sie in AbstractBinary auch aufgerufen werden.
[/code]

Was ist, wenn es noch eine Unterklasse von Div gibt. Und oper() in AbstractBinary deklariert ist, aber oper() in einer Unterklasse von Div implementiert wird. Würde das auch funktionieren?
 

mrBrown

Super-Moderator
Mitarbeiter
Der erste Ausdruck ist die polnische Notation fürs addieren, addiert werden sollen die Konstanten Werte 1,5 und 2,5, also 1,5 2,5 +.

Bei der zweiten Ausgabe wird's klarer, wenn man Klammer setzt:
(((1,5 2,5 +) 1/x) ((1,5 2,5 +) +/-) *)

Ganz außen ist Mul, welches die beiden Teilausdrücke a) ((1,5 2,5 +) 1/x) und b) ((1,5 2,5 +) +/-) enthält.
a) ist die Darstellung von Inv, (1,5 2,5 +) ist dabei wieder die übergeben Rechnung aus dem ersten Ausdruck, 1/x die Darstellung von Inv.
b) ist die Darstellung von Chs,(1,5 2,5 +) ist dabei wieder die übergeben Rechnung aus dem ersten Ausdruck, +/- die Darstellung von Chs.
 

JavaIsTheBest

Bekanntes Mitglied
Ich hab versucht, den Aufrufbaum für die compute() Methode zu zeichnen. Bei dem grün markierten bin ich mir unsicher. Welcher ist der linke bzw. rechte Ausdruck?
 

Anhänge

  • 01.png
    01.png
    20,3 KB · Aufrufe: 22

Neue Themen


Oben