.oisyn 17-1-200 1:31 vanwaar dan deze vraag:
"is hier een generieke oplossing voor bedacht
waarbij er wel een default-methode op te geven *
is zonder dat er aanpassingen in de
Visitable-Objecten nodig zijn?"
ACM 17-1-200 1:31 nou...
als ik
Visit(Blaat b)
Visit(SubBlaat b)
doe, zal de tweede nooit gebruikt worden...
en DAT wil ik juist wel, maar als er ook een
SubBlaat2 is dan moet die weer door de eerste
afgehandeld worden
.oisyn 17-1-200 1:33 waarom zou de 2e nooit aangeroepen worden?
ACM 17-1-200 1:33 omdat Java de meest generieke variant van de
methode pakt...
dus voor SubBlaat pakt ie de Blaat variant
.oisyn 17-1-200 1:34 niet als er ook een methode voor Blaat is
ACM 17-1-200 1:34 das trouwens een bekend probleem met Visitors
geloof ik, wil wel es weten of er een oplossing
voor is
.oisyn 17-1-200 1:34 of ben ik nu gek
ACM 17-1-200 1:35 euh... overnieuw:
Blaat is een superclass van SubBlaat en SubBlaat2
// default
Visit(Blaat)
// specialisatie, dus NIET de default uitvoeren
voor deze
Visit(SubBlaat)
// de specialisatie wordt nooit gebruikt
.oisyn 17-1-200 1:35 lijkt me best lomp als dat zo is
een visit (SubBlaat) matcht toch veel beter dan
een visit (Blaat) als het een SubBlaat betreft
dus het lijkt me dat dan visit (SubBlaat) ook
aangeroepen wordt
ACM 17-1-200 1:35 denk dat je het niet helemaal snapt
ACM 17-1-200 1:35 ja, dat WIL ik, maar dat doet java niet...
.oisyn 17-1-200 1:35 dat, of jou uitleg zuigt
.oisyn 17-1-200 1:35 niet?
ACM 17-1-200 1:35 nope
test maar
.oisyn 17-1-200 1:35 oh ok
ja in C++ is dat wel zo, maar van java weet ik
het dus niet zeker
.oisyn 17-1-200 1:36 ok
.oisyn 17-1-200 1:36 hmm kut, jdk niet geinstalleerd
ACM 17-1-200 1:37 haha, ik zal het es met een simpel voorbeeld
testen
.oisyn 17-1-200 1:40 maar je kan idd wel eens gelijk hebben, volgens
mij ben ik hier eerder al eens over gevallen
in een topic van alarmnummer of mbravenboer ofzo
ACM 17-1-200 1:44 ::::::::::::::
Caller.java
::::::::::::::
class Caller
{
Caller(Test test)
{
System.out.println("Called with
test");
}
Caller(SubTest s)
{
System.out.println("Called with
subtest");
}
public static void main(String[] argv)
{
Test test = new Test();
new Caller(test);
SubTest s = new SubTest();
new Caller(s);
Test t = new SubTest();
new Caller(t);
}
}
::::::::::::::
SubTest.java
::::::::::::::
class SubTest extends Test
{
}
::::::::::::::
Test.java
::::::::::::::
class Test
{
Test()
{
new Caller(this);
}
}
heeft als output:
Called with test
Called with test
Called with test
Called with subtest
Called with test
Called with test
kortom... ipv 4x de Called with subtest alleen
maar in de expliciete variant...
ACM 17-1-200 1:44 en laat dat nou net niet kunnen als je Visitors
enzo gebruikt
.oisyn 17-1-200 1:46 hmm, vervelend
ACM 17-1-200 1:46 yups, dat doet c++ wel goed?
.oisyn 17-1-200 1:46 ja
ACM 17-1-200 1:46 wow
een pluspunt voor c++
.oisyn 17-1-200 1:47 idd ^_^