# Arithmetische Ausdrücke



## JavaIsTheBest (27. Mai 2016)

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.


----------



## VfL_Freak (27. Mai 2016)

Moin,

schau mal Dein Diagramm an ...
"_*oper()*_" kommt doch aus dem Interface "_*Complex*_" und wird dann in "_*AbstractBinary*_" überschrieben !!

Gruß Klaus


----------



## mrBrown (27. Mai 2016)

VfL_Freak hat gesagt.:


> 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 




JavaIsTheBest hat gesagt.:


> 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.



JavaIsTheBest hat gesagt.:


> 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: 
	
	
	
	





```
(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.
```


----------



## VfL_Freak (27. Mai 2016)

mrBrown hat gesagt.:


> Wird erst in Div, Mul etc überschrieben


Hach ... immer diese Haarspalterei  

Aber Du hast natürlich Recht - Danke für den Hinweis 
Gruß Klaus


----------



## JavaIsTheBest (27. Mai 2016)

mrBrown hat gesagt.:


> 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?


----------



## VfL_Freak (27. Mai 2016)

Solange die Du die Vererbungshierarchie einhälst, geht das natürlich - so ich denn die Frage richtig verstanden haben 

Hier mal einige Links zum Thema "Vererbung":
http://openbook.rheinwerk-verlag.de...05_008.htm#mjf275cae4069cb07f60b602bcbea532c8
http://www.java-tutorial.org/vererbung.html
https://de.wikibooks.org/wiki/Java_Standard:_Vererbung

Gruß Klaus


----------



## mrBrown (27. Mai 2016)

JavaIsTheBest hat gesagt.:


> 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?



Allerdings muss Div dann auch abstrakt sein, da noch nicht alle Methoden implementiert sind


----------



## JavaIsTheBest (27. Mai 2016)

Könntet ihr mir die Aufgabe 1e) erklären? Wie komme ich zu der Ausgabe?


----------



## mrBrown (27. Mai 2016)

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 (28. Mai 2016)

Es wird in der Main aber nicht die toString() Methode aufgerufen. Somit dürfte man doch nicht, auf diese Darstellung kommen?


----------



## mrBrown (28. Mai 2016)

Das #println ruft, wenn Objekte geprintet werden sollen, deren #toString auf


----------



## JavaIsTheBest (28. Mai 2016)

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?


----------

