Avatar billede fastpoint Nybegynder
01. november 2004 - 10:55 Der er 21 kommentarer og
1 løsning

En gåde? Arv

Kom til at tænke på noget lidt morsomt.. og tænkte på om nogen skulle have tænkt over dette også..

Lad os antage vi har 3 klasser..

Klasse1 (superklasse)
Klasse2 (subklasse - arver fra Klasse1)
Klasse3 (subklasse - arver fra Klasse2!!) <- noter dette!

Vi skal yderligere antage, at alle klasser har deres egen toString metode!

Gåden er! Kan man fra Klasse3 kalde Klasse1's toString metode uden at gøre det igennem Klasse2's toString metode?

prøvede for sjov..

super.super.toString();


det kunne man ikke..
Avatar billede arne_v Ekspert
01. november 2004 - 11:00 #1
Har du prøvet:

((Klasse1)this).toString()

?
Avatar billede fastpoint Nybegynder
01. november 2004 - 11:00 #2
kan lige prøve
Avatar billede fsconsult.dk Nybegynder
01. november 2004 - 11:03 #3
Umiddelbart ville jeg mene at klasse 2's toString dækker over klasse 1's, og at det derfor ikke umiddelbart at benytte metoder man har re-defineret.

Man kan lave en protected myToString metode i klasse 1, som kunne kaldes fra toString i både klasse 1 og klasse 3, men ikke 100% optimalt.
Avatar billede sovsekoder Nybegynder
01. november 2004 - 11:05 #4
http://forum.java.sun.com/thread.jsp?thread=556683&forum=31&message=2729835

her siges det at det ikke kan lade sig gøre uden at lave en metode der forwarder i klasse2


åbenbart flere på nettet der har muntret sig (søg f.eks efter '"super.super" java' i google)
Avatar billede fastpoint Nybegynder
01. november 2004 - 11:05 #5
arne_v:

Det kunne man ikke den gik faktisk helt amok hehe
den skrev hele tiden

at mypackage1.Klasse1.toString(Klasse1.java:18)

fsconsult.dk:

du mener altså lave en ekstra toString metode i klasse1? for det skal jo helst undgås: )
Avatar billede fastpoint Nybegynder
01. november 2004 - 11:06 #6
kigger lige sovsekoder:)
Avatar billede arne_v Ekspert
01. november 2004 - 11:08 #7
Hvis ikke upcast virker (og fsconsult har helt ret i at en virtuel metode
bør overslrives), så kan det ikke lade sig gøre.
Avatar billede fastpoint Nybegynder
01. november 2004 - 11:14 #8
upcast virker ikke, men det også helt okay.. undrede mig bare lidt over om man kunne... meningen med arv er jo at man ikke skal gentage sig så vidt jeg har forstået... eller genbruge allerede skrevet kode.
Avatar billede fsconsult.dk Nybegynder
01. november 2004 - 11:19 #9
fastpoint> hvis du laver en protected myToString i klasse1, og så i klasse1 og klasse3 laver en  public String toString() { return myToString(); }
Avatar billede sovsekoder Nybegynder
01. november 2004 - 11:22 #10
er fastpoint, 01/11-2004 11:14:05 besked til mig?

det jeg mente var i Klasse2, have en :
string toStringForwarder()
{
  return super.toString();
}
Avatar billede sovsekoder Nybegynder
01. november 2004 - 11:22 #11
og fra klasse 3, kalde super.toStringForwarder();
Avatar billede fastpoint Nybegynder
01. november 2004 - 11:30 #12
sovsekoder:
Din metode virker faktisk godt..

fsconsult.dk:
Din metode virker faktisk også!

men det vil altså sige man skal ind og lave nogen metoder så det svaret er altså at det ikke er muligt.. så ville svaret nok have været noget lignende det arne skrev.. altså
((Klasse1)this).toString()

så ved jeg det! så behøver jeg ikke tænke over det mere hehe
Avatar billede sovsekoder Nybegynder
01. november 2004 - 11:32 #13
fik du prøvet : ((Klasse1)this).toString() ?
Avatar billede sovsekoder Nybegynder
01. november 2004 - 11:33 #14
altså om man kunne det arne_v skrev
Avatar billede arne_v Ekspert
01. november 2004 - 11:37 #15
Det virker ikke.

Jeg har også selv prøvet.

Alle instans metoder er virtuelle i Java og overskrives, så man laver bare
en uendelig rekursion.
Avatar billede sovsekoder Nybegynder
01. november 2004 - 11:38 #16
ok!
Avatar billede fastpoint Nybegynder
01. november 2004 - 11:38 #17
((Klasse1)this).toString()

ja det gjorde jeg! men måske kan arne give mig ret i, at grunden til at der kommer en fejl er fordi den kalder sin egen toString metode og ikke Klasse1's toString metode... og det bliver den ved med.. dvs den kører rundt..

jeg rimelig sikker på det er det der sker.. men måske har arne noget at tilføje: ) det trods alt hans forslag hehe
Avatar billede fastpoint Nybegynder
01. november 2004 - 11:39 #18
hehe 01/11-2004 11:37:14

og arne skriver har skrevet det.. med korrekte udtryk;)
01/11-2004 11:37:14
Avatar billede fastpoint Nybegynder
01. november 2004 - 11:44 #19
lukker lige spørgsmålet for en god ordens skyld.. håber andre kan få nytte er dette senere;)
Avatar billede arne_v Ekspert
01. november 2004 - 11:47 #20
Det kunne gøres i C++ eller C# hvis metoderne ikke var virtual.
Avatar billede jakoba Nybegynder
01. november 2004 - 11:48 #21
Hvis metoden toString er defineret som en statisk metode kan du kalde Klasse1's toString metode ved at caste dit objekt til Klasse1.

men hvis metoden ikke er statisk er det ligemeget hvad du caster en Klasse3 instans til, det vil stadig være Klasse3's toString metode der bliver kaldt.

( der er dem der kalder det en bommert i Javasproget, men jeg kan ikke rigtig se hvordan det kan være anderledes :)

mvh JakobA
Avatar billede arne_v Ekspert
01. november 2004 - 11:57 #22
Du kan ikke bruge this i en static metode.

Men man kan selvføgelig altid kalde Klasse1.metodenavn hvis den er static.

Man har valgt at lave alle metoder virtual i Java.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester