OOP Anregung zu Übungsaufgabe gesucht, Thema: Bindung

b1naryb0b

Mitglied
Hey, ich habe folgende Aufgabe zu bearbeiten, dabei habe ich aber leider garkeinen ansatz, vielleicht kann mir jemand helfen :)

Aufgabe 3 (Zusatz) Bindung (10 Punkte)
Methoden k¨onnen in Java ¨uberladen und Variablen ¨uberdeckt werden. Die Zuordnung der entsprechenden
Methode oder Variable erfolgt ¨uber die Bindung. Sehen Sie sich dazu folgende Beispiele an:

a) Gegeben seien folgende Methoden, wobei Y Unterklasse von X und Z Unterklasse von Y ist:
Java:
int add(double a, float b) {...} // Methode 1
int add(long a, int b) {...} // Methode 2
void print(X a, Y b) {...} // Methode 3
void print(Y b, Z c) {...} // Methode 4

Welche Methode wird statisch an folgende Aufrufe gebunden, bzw. was passiert bei folgenden Aufrufen(begründen)?

Java:
X x = new X(); Y y = new Y(); Z z = new Z();
add(1.0, 2.0); // Aufruf 1
add(2.0, 1.0F); // Aufruf 2
add(1, 2); // Aufruf 3
add(2, 1L); // Aufruf 4
print(z, z); // Aufruf 5
print(x, z); // Aufruf 6
print(z, y); // Aufruf 7
print(y, x); // Aufruf 8

b) Gegeben seien die Klassen A, B und C, wobei B von A und C von B abgeleitet ist, sowie die folgenden
Klassen:

Java:
public class Print1 {
int x = 3;
public void print(A a) { System.out.println(x); }
public void print(B b) { System.out.println(x+1); }
}
public class Print2 extends Print1 {
int x = 7;
public void print(A a) { System.out.println(x); }
public void print(B b) { System.out.println(x+1); }
public void print(C c) { System.out.println(x+2); }
}

WelcheMethode welcher Klasse wird benutzt bzw. was passiert bei folgenden Aufrufen (begründen)?

Java:
A a = new A(); B b = new B(); C c = new C();
Print1 p1 = new Print1();
Print2 p2 = new Print2();
p1 = p2;
System.out.println(p1.x); // Aufruf 1
System.out.println(((Print2)p1).x); // Aufruf 2
((Print2)p1).print(c); // Aufruf 3
p1.print(c); // Aufruf 4
((Print1)p2).print(b); // Aufruf 5
((Print1)p2).print(c); // Aufruf 6
p2.print(c); // Aufruf 7
p1 = new Print1();
((Print2)p1).print(a); // Aufruf 8

Wie gesagt, es geht mir nicht um eine Lösung, das macht den Spaß dran kaputt, aber ein Denkanstoß wäre ganz nett :)
Grüße Lukas :)
 
S

SlaterB

Gast
damit es nicht den Charakter 'andere lösen die Aufgabe für dich' erhält,
wäre es sinnvoll, wenn du 'begründen' aus der Aufgabenstellung hier beherzigen würdest,

so könnte man auch vermuten dass du in jede Zeile blind eine Zahl geschrieben hast und auf die korrekten Ergebnisse wartest,

ob sie korrekt sind habe ich allerdings bisher nicht nachgeschaut,
in einem entsprechenden Java-Programm könntest du dir die richtigen Verknüpfungen auch gleich anschauen,
falls das die Frage ist

> Wie gesagt, es geht mir nicht um eine Lösung, das macht den Spaß dran kaputt, aber ein Denkanstoß wäre ganz nett

was soll man denn anstoßen, wenn die Matheaufgabe 5 + 5 ist?
wie man rechnet/ wie man Methodenbindung bestimmt, dafür gibt es Regeln, die du nur noch (möglichst korrekt) anwenden musst
 

b1naryb0b

Mitglied
Danke erstmal für die Antwort,

Wir hatten in einer Übung schonmal eine ähnliche Aufgabe, und da kamen für mich Ergebnisse raus, die nicht logisch waren für mich. Und auch hier sitze ich wieder einmal davor.
Die Kommentare "Aufruf 8" etc. sind nicht meine Lösung, sie sind Bestandteil der Aufgabenstellung.

Ich verstehe nicht , wieso z.b. was bei add(1.0, 2.0) geschieht, da es ja keine methode für (double, double) gibt. Ich weiß, dass das der Kern der Aufgabe ist, aber ich weiß nicht wie ich herausbekomme, was z.b. särkker oder was schwächer bindet.
 
S

SlaterB

Gast
den genauen Vorgang kenne ich selber auch gar nicht
Auflösung von Überladung, Überschreiben, dynamisches Binden | mpaap.de
Wie funktioniert die Auflösung der Überladung durch den Compiler genau?

Die Auflösung von Überladung durch den Compiler erfolgt nach dem Most-Specific-Algorithmus, der selbst wieder in mehreren Schritten abläuft. Dabei werden prinzipiell nur die Deklarationstypen (= statischen Typen) des Empfängers des Methodenaufrufs sowie der Parameter berücksichtigt, denn nur diese sind dem Compiler bekannt.

Im ersten Schritt wird eine Liste mit zum Aufruf passenden Methoden angelegt, das sind alle, für die gilt, dass die Deklarationstypen der Aufrufparameter Subtypen der Deklarationstypen der formalen Parameter der Methode sind. Besteht diese Liste nur aus einem Element, wird direkt der betreffende Methodenaufruf in den Bytecode geschrieben.

Wenn die Liste der zum Aufruf passenden Methoden mehrere Elemente enthält, ist ein weiterer Schritt erfoderlich, die Auswahl der speziellsten Methode. Dazu wird aus der Liste jede Methode gestrichen, für die es in der Liste eine speziellere gibt. Der Vergleich, welche von zwei Methoden spezieller ist, ist dabei völlig unabhängig vom konkreten Methodenaufruf: Eine Methode M2 ist genau dann spezieller als eine Methode M1, wenn für jeden formalen Parameter von M2 gilt, dass sein Typ Subtyp des Typs des entsprechenden formalen Parameters von M1 ist. Bleibt nach dem Streichen genau eine Methode übrig, ist diese die speziellste zum Aufruf passende und ein entsprechender Aufruf wird in den Bytecode geschrieben. Bleiben mehrere Methoden übrig, dann sind diese offenbar gleich speziell, und es ist nicht möglich, den Methodenaufruf eindeutig aufzulösen. → Compilerfehler.
du selber hast hoffentlich auch eine Anleitung bekommen, wenn du eine Aufgabe lösen sollst..

> z.b. was bei add(1.0, 2.0) geschieht

was tatsächlich geschieht, kann dir wie gesagt der Compiler beantworten, wenn du ein entsprechendes Programm schreibst,
mit deiner Begründung
> da es ja keine methode für (double, double) gibt.
bist du aber schon genau an der Wahrheit angelangt, es gibt nichts mehr hinzuzufügen,

nun nur noch den Rest ;)


----

ich hatte die Kommentare in der Tat als Lösung gelesen, aber ist ja nur Nummerierung..
 
Zuletzt bearbeitet von einem Moderator:

b1naryb0b

Mitglied
Supi, danke erstmal für die schnelle Hilfe, ich denke das bringt mich weiter! :)
Ich werde mich mal dransetzen und meine Lösungen dann hier posten :)
 

Neue Themen


Oben