Seite 1 von 1

Übung02

Verfasst: 4. Mai 2014 18:05
von m_flaig
Hier können Sie Fragen zu Übung02 stellen oder zu Themen, die in Übung02 behandelt wurden.

Re: Übung02

Verfasst: 9. Mai 2014 12:10
von Li_za
Hi

im 2 Übung 3c Aufgabe muss man 2 Methoden im Klasse BinaryOperation schreiben: public Tern getLeft() und getRight(), die den linken bzw rechten im Konstruktor festgelegten Operanden der Operation zurückgeben.

die Frage ist, welche Konstruktor, Operanden und Operation ist hier gemeint?

danke im Voraus

Re: Übung02

Verfasst: 9. Mai 2014 22:19
von m_flaig
Hallo,

mit Konstruktor ist der Konstruktor der Klasse BinaryOperation gemeint, den Sie noch schreiben müssen. Dieser bekommt zwei Operanden (Terme) übergeben (right,left) und initialisiert zwei Objektvaribalen. Mit getLeft() und getRight() werden diese Objektvariablen zurückgegeben.

Mit einer binären (von lat. bini, für „je zwei“) Operation ist eine Operation gemeint, welche zwei Terme verknüpft. Ein gutes Beispiel ist die Addition in der nächsten Teilaufgabe, die eine Unterklasse der BinärenOperation darstellt.

Viele Grüße,
M.Flaig

Re: Übung02

Verfasst: 18. Mai 2014 12:22
von Holly19
Hallo,
ich habe eine Frage zu Aufgabe 3d: Es soll die arithmetische Summe der beiden Operanden berechnet werden. Die beiden Operanden sind jedoch von Typ Term und der Rueckgabetyp von getValue ist int. Das Konvertieren funktioniert leider nicht, kann mir jemand helfen?
Danke schonmal und liebe Gruesse :-)

Re: Übung02

Verfasst: 18. Mai 2014 13:34
von SophiaLi1
Hey,

Du könntest zum Beispiel die Klasse AbsoluteTerm benutzen, die in einer Objektvariable einen int-Wert speichern kann. Hast du nun zwei Objekte der Klasse AbsoluteTerm, dann kannst du die addierten Objektvariablen in getValue zurückgeben. Das sollte dir als Hinweis helfen. Wenn nicht, frag einfach nochmal genauer :)

Re: Übung02

Verfasst: 26. Mai 2014 10:53
von m_flaig
Eine Musterlösung ist ab sofort in moodle verfügbar.

Re: Übung02

Verfasst: 14. Jun 2014 11:23
von Goelz_M
Hallo,
in der Musterlösung zu den Zusatzaufgaben von Übung02 befindet sich -glaube ich- ein Fehler. Es wird bei c) gesagt, dass ein Downcast ein Objekt einer Basisklasse zu einem Objekt einer abgeleiteten Klasse macht. Das stimmt jedoch meiner Meinung nach nicht - es wird nur die Variable verändert, das Objekt bleibt jedoch gleich.
Beispiel

Code: Alles auswählen

public class X{}

public class Y extends X{ 
public int x;
public Y(int x){
this.x=x;
}

public class Z {
Y test = new Y(5);
System.out.println(test.x); //Sollte 5 ausgeben, wenn ich mich nicht auf die Schnelle verschrieben habe ;)

X test2 = new X();
Y test3 = (Y) test2;
System.out.println(test3.x); 
Was sollte denn hier am Ende nun ausgegeben werden? Wenn man das Objekt verändert hätte, müsste bei der Transformation von X nach Y irgendwie ja auch das Attribut x dazugekommen sein. Das geht aber gar nicht, deshalb funktioniert Downcast ja nur, wenn die zu castende Variable auf ein Objekt der abgeleiteten Klasse (oder nochmal davon abgeleiteten Klasse) verweist (dazu ja auch instanceof). Das ganze hat also gar nichts mit dem Objekt direkt zu tun, sondern nur mit den sich ändernden Variablen.
Dass das Objekt seine Klassenzugehörigkeit verändert, nennt man Polymorphie. Und das funktioniert meines Wissens nach nur von Basisklasse zu abgeleiteter Klasse.
Korrigiert mich, wenn ich was falsch verstanden habe. Falls nicht, korrigiert bitte die Lösung :wink:

Re: Übung02

Verfasst: 14. Jun 2014 20:29
von m_flaig
Goelz_M hat geschrieben:Das stimmt jedoch meiner Meinung nach nicht - es wird nur die Variable verändert, das Objekt bleibt jedoch gleich.
"Variable" ist auch nicht richtig.. einigen wir uns darauf, dass beim Downcast die Referenz einer Basisklasse auf eine ihrer abgeleiteten Klassen gecastet wird, so stimme ich zu :wink:

VG,
M.Flaig

Re: Übung02

Verfasst: 15. Jun 2014 10:25
von Goelz_M
Na gut :mrgreen:

Re: Übung02

Verfasst: 15. Jun 2014 11:25
von m_flaig
Einigen wir uns auf Unentschieden 8)

Hier nochmal ein ergänzender Wiki Artikel zum Verständnis:
http://en.wikipedia.org/wiki/Downcasting

VG,
M.Flaig

Re: Übung02

Verfasst: 17. Jun 2014 12:03
von Holly19
SophiaLi1 hat geschrieben:Hey,

Du könntest zum Beispiel die Klasse AbsoluteTerm benutzen, die in einer Objektvariable einen int-Wert speichern kann. Hast du nun zwei Objekte der Klasse AbsoluteTerm, dann kannst du die addierten Objektvariablen in getValue zurückgeben. Das sollte dir als Hinweis helfen. Wenn nicht, frag einfach nochmal genauer :)
Hi,
ich hab doch nochmal eine Frage zu dieser Aufgabe. Also in der MuLö steht ja Folgendes für die Methode int getValue() der Klasse Addition:

public int getValue() {
return getLeft().getValue() + getRight().getValue();
}

Das getValue() stammt ja aus der AbsoluteTerm-Klasse. Aber dann muss ich doch sicher sein, dass getLeft() auf jedenfall ein Objekt der Klasse AbsoluteTerm liefert, oder? Die Methode funktioniert doch nicht mehr, wenn ich dem Konstruktor der Klasse Addition zwei Objekte übergebe, die nicht von Typ AbsoluteTerm, sondern vom Typ einer anderen Term implementierenden Klasse sind?

Liebe Grüße!

Re: Übung02

Verfasst: 17. Jun 2014 13:27
von aDramaQueen
Das Problem hier ist (mal wieder) die Interpretationsmöglichkeit der Aufgabenstellung. Du hast recht, dass das auf jeden Fall ne AbsoluteTerm-Instanz sein muss. Allerdings wird in der Mu-Lö nicht explizit im Code des Programms selbst dafür gesorgt, sondern statt dessen in der testClass:

Code: Alles auswählen

public class testClass {

	//Testing
	public static void main(String[] args) {
		Term term1 = new AbsoluteTerm(42);
		Term term2 = new AbsoluteTerm(3);
		.....
   }
}
Ich persönlich hab das auch so wie du verstanden und schon im Programm selbst dafür gesorgt, dass es so ist wie's sein soll:

Code: Alles auswählen

public abstract class BinaryOperation implements Term {
	
	private Term left,right;
	
	public BinaryOperation(int a, int b) {
		left = new AbsoluteTerm(a);
		right = new AbsoluteTerm(b);
	}
	.....
}

Re: Übung02

Verfasst: 17. Jun 2014 14:51
von Holly19
alles klar, danke!

Re: Übung02

Verfasst: 17. Jun 2014 17:55
von m_flaig
aDramaQueen hat geschrieben:Das Problem hier ist (mal wieder) die Interpretationsmöglichkeit der Aufgabenstellung.
Dies ist kein Problem, sondern soll Ihnen mehr Freiheit beim Programmieren geben! Wenn alle Programmierschritte haarklein beschrieben sind, ist kein Lerneffekt vorhanden. Die Umsetzung ist (meist) relativ frei wählbar, was am Ende zählt, ist die Funktionalität des Programms.

Zum Thema Musterlösung: Wie der Name schon sagt, sind oft viele andere Lösungen auch richtig. Gerade in der von Ihnen genannten Aufgabe ist auch Ihre Lösung richtig.

Viele Grüße,
M.Flaig