Übung02

Moderator: AI 2

m_flaig
Moderator
Moderator
Beiträge: 272
Registriert: 27. Sep 2009 14:02

Übung02

Beitrag von m_flaig »

Hier können Sie Fragen zu Übung02 stellen oder zu Themen, die in Übung02 behandelt wurden.

Li_za
Neuling
Neuling
Beiträge: 4
Registriert: 2. Nov 2013 17:53

Re: Übung02

Beitrag 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

m_flaig
Moderator
Moderator
Beiträge: 272
Registriert: 27. Sep 2009 14:02

Re: Übung02

Beitrag 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

Holly19
Erstie
Erstie
Beiträge: 21
Registriert: 18. Mai 2014 12:15

Re: Übung02

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

Benutzeravatar
SophiaLi1
Moderator
Moderator
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: Übung02

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

m_flaig
Moderator
Moderator
Beiträge: 272
Registriert: 27. Sep 2009 14:02

Re: Übung02

Beitrag von m_flaig »

Eine Musterlösung ist ab sofort in moodle verfügbar.

Goelz_M
Erstie
Erstie
Beiträge: 16
Registriert: 20. Okt 2013 11:38

Re: Übung02

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

m_flaig
Moderator
Moderator
Beiträge: 272
Registriert: 27. Sep 2009 14:02

Re: Übung02

Beitrag 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

Goelz_M
Erstie
Erstie
Beiträge: 16
Registriert: 20. Okt 2013 11:38

Re: Übung02

Beitrag von Goelz_M »

Na gut :mrgreen:

m_flaig
Moderator
Moderator
Beiträge: 272
Registriert: 27. Sep 2009 14:02

Re: Übung02

Beitrag 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

Holly19
Erstie
Erstie
Beiträge: 21
Registriert: 18. Mai 2014 12:15

Re: Übung02

Beitrag 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!

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Übung02

Beitrag 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);
	}
	.....
}
Bild
...Never go full retard...

Holly19
Erstie
Erstie
Beiträge: 21
Registriert: 18. Mai 2014 12:15

Re: Übung02

Beitrag von Holly19 »

alles klar, danke!

m_flaig
Moderator
Moderator
Beiträge: 272
Registriert: 27. Sep 2009 14:02

Re: Übung02

Beitrag 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

Antworten

Zurück zu „AI 2“