Verstandenproblem bei Vorlesung stoff

yanan
Neuling
Neuling
Beiträge: 4
Registriert: 8. Nov 2005 16:52

Verstandenproblem bei Vorlesung stoff

Beitrag von yanan » 28. Jan 2008 12:06

Hallo,
Ich habe einige kleine Fragen bei double dispatch.
1.In chapter 6 auf seiten 49 gibt's eine Frage: Why do we have to implement the intersect(Shape s) method in
each class? Die Antwort habe ich nicht verstanden:"At compile-time the static type of the method parameters is used to determine the target method."
Ob die Ziel methode würde aufgerufen im laufzeit, oder was? Was ist die Unterschied zwischen compile zeit und laufzeit bei method aufruf?

interface Shaple {
intersect(Shape s)
intersect(Circle c)
intersect(Rectangle r)
intersect(Triangle t)
}
class Triangle implement Shape {
intersect(Shape s) { s.intersect((Triangle)this);}
intersect(Circle c){...}
intersect(Rectangle r){...}
intersect(Triangle t){...}
}
2.Auch in Chapter6 auf seite 50: das schritt 2.2 kann ich nicht folgen.Warum geht es zum Rectangle klasse? ich meine es sollte intersect(Rectangle r) in klasse Triangle sein (trotzdem es ist falsch).
Und warum erstellt man die 3 interface methode intersect(Circle c),intersect(Rectangle r),intersect(Triangle t) in Shape interface?
Code sieht unter:
Shape t = new Triangle(...);
Shape r = new Rectangle(...);
if (t.intersect(r)) {...}

3.wenn 3 konkrete klasse erben ein abstract klasse (nicht interface), gibt's noch multi-polymorphie bei diese situation?

danke voraus
Zuletzt geändert von yanan am 28. Jan 2008 12:19, insgesamt 2-mal geändert.

marcel_b
Nerd
Nerd
Beiträge: 600
Registriert: 31. Okt 2006 17:04
Kontaktdaten:

Re: Verstandenproblem bei Vorlesung stoff

Beitrag von marcel_b » 28. Jan 2008 12:10

Hi Yanyan,

Poste mal den vollständigen Quellcode hier im Forum. Wir diskutieren das dann am Code.

marcel_b
Nerd
Nerd
Beiträge: 600
Registriert: 31. Okt 2006 17:04
Kontaktdaten:

Double Dispatch

Beitrag von marcel_b » 28. Jan 2008 15:59

Hi,

3 Schritte für das Verstehen:

1.

lies mal hier http://en.wikipedia.org/wiki/Double_dispatch und beantworte folgende Fragen:
Was ist Single-Dispatch?
Was ist der Unterschied zwischen Single-Dispatch und Double-Dispatch?
Was ist Multi-Dispatch?

2.
Schreib eine Klasse (oder nimm die Klassen aus dem Visitor-Lab mit den Shapes) , die das Problem ohne die jeweiligen Methoden für jeden Subtyp auskommt - also eine Klasse, die nur mit der intersect(Shape s) auskommt. Wenn du das implementiert hast, solltest du das Problem hoffentlich schon erkennen.

3.
Vergleiche dann: Wie sieht der Code aus, der das Shape-Problem mit Single Dispatch löst?

Poste den Code für die Klasse Triangle.

Viele Grüße
Marcel

yanan
Neuling
Neuling
Beiträge: 4
Registriert: 8. Nov 2005 16:52

Re: Double Dispatch

Beitrag von yanan » 29. Jan 2008 15:00

marcel_b hat geschrieben:Hi,

3 Schritte für das Verstehen:

1.

lies mal hier http://en.wikipedia.org/wiki/Double_dispatch und beantworte folgende Fragen:
Was ist Single-Dispatch?
Was ist der Unterschied zwischen Single-Dispatch und Double-Dispatch?
Was ist Multi-Dispatch?

2.
Schreib eine Klasse (oder nimm die Klassen aus dem Visitor-Lab mit den Shapes) , die das Problem ohne die jeweiligen Methoden für jeden Subtyp auskommt - also eine Klasse, die nur mit der intersect(Shape s) auskommt. Wenn du das implementiert hast, solltest du das Problem hoffentlich schon erkennen.

3.
Vergleiche dann: Wie sieht der Code aus, der das Shape-Problem mit Single Dispatch löst?

Poste den Code für die Klasse Triangle.

Viele Grüße
Marcel
Meine Antworten:
1.Sigle dispatch ist Methode aufruf anhand des objects typ in runtime, wenn mehre klasse die verschiedene Implementation von dieser Methode enthalten und bei compilezeit wird die genaue implementation von methode noch nicht erkennt.
Double dispatch beschreibt methode aufruf anhand nicht nur des objects typ sonder auch parameters typ at runtime,aber nur einer Parameter
Multi-dispach darf methode aufruf bei runtime anhand mehres parameters typs.
2. Problem habe ich erkennt. d.h. gibt's eine exception. Aber verstehe ich nicht warum?
3. das code sieht so aus:
public class Triangle implements Shape {
public boolean intersect(Shape s){
if (s instanceof Triangle)
{System.out.print("triangle intersect with triangle");
return true;
}
else if (s instanceof Circle)
{ System.out.print(" triangle intersect with circle");
return true;
}
return false;
}
}
...............
Shape t = new Triangle();
Shape c = new Circle();
if (c.intersect(t)) System.out.print(", ok");
output ist:
Circle intersect with triangle, ok

marcel_b
Nerd
Nerd
Beiträge: 600
Registriert: 31. Okt 2006 17:04
Kontaktdaten:

Re: Double Dispatch

Beitrag von marcel_b » 29. Jan 2008 20:54

yanan hat geschrieben:Meine Antworten:
1.Sigle dispatch ist Methode aufruf anhand des objects typ in runtime, wenn mehre klasse die verschiedene Implementation von dieser Methode enthalten und bei compilezeit wird die genaue implementation von methode noch nicht erkennt.
Double dispatch beschreibt methode aufruf anhand nicht nur des objects typ sonder auch parameters typ at runtime,aber nur einer Parameter
Multi-dispach darf methode aufruf bei runtime anhand mehres parameters typs.
Richtig. Damit sollte deine erste Frage jetzt klar sein: "At compile-time the static type of the method parameters is used to determine the target method."

yanan hat geschrieben:2. Problem habe ich erkennt. d.h. gibt's eine exception. Aber verstehe ich nicht warum?
Wieso gibt es eine Exception? Nein. Der Code kompiliert. Du bist nur gezwungen alle Typen mit Hilfe eines instanceof Operators zu überprüfen und dann entsprechend zu reagieren.
yanan hat geschrieben:3. das code sieht so aus:
public class Triangle implements Shape {
public boolean intersect(Shape s){
if (s instanceof Triangle)
{System.out.print("triangle intersect with triangle");
return true;
}
else if (s instanceof Circle)
{ System.out.print(" triangle intersect with circle");
return true;
}
return false;
}
}
Ja, so ungefär sollte der code aussehen.

Jetzt fassen wir zusammen: Zwei Dinge musst du verstehen. Java unterstützt nur Single-Dispatch. Also wird die auzurufenden Methode statisch zum Zeitpunkt des Kompilierens anhand des Methodennamens und des statischen Typs der Parameter festgelegt. Was nicht bekannt ist, ist die Klasse in der die Methode steht. Sie wird zur Laufzeit ermittelt und hängt vom Typ des Receivers ab.

Angenommen dein Code sieht so aus


Shape t = new Triangle();
Shape s = new Triangle();
t.intersect(s)

dann wird die Methoden Triangle.intersect(Shape) ausgeführt.


Shape t = new Triangle();
Triangle s = new Triangle();
t.intersect(s)

Dann wird Triangle.intersect(Triangle) ausgeführt.

Viele Grüße
Marcel

yanan
Neuling
Neuling
Beiträge: 4
Registriert: 8. Nov 2005 16:52

Re: Verstandenproblem bei Vorlesung stoff

Beitrag von yanan » 30. Jan 2008 15:59

Danke für antworten. Ich bin schon klar für das problem :D

Antworten

Zurück zu „Archiv“