Hoi, taas on probleema kohdannut ihmislasta.
Oletetaan, että on yliluokka A. Sen perii luokat B ja C. Luokat järjestyvät Composite-suunnittelumallin mukaisesti:
C-luokka on se Composite-luokka, joka siis Composite-suunnittelumallin mukaisesti perii luokan A. C-luokka koostuu myös yliluokan tyyppisistä olioista - eli luokka C toimii säiliönä yliluokan tyyppisille olioille. Koska yliluokka on abstrakti, käytännössä luokka C koostuu siis B- ja C-luokan ilmentymistä (itsensätyyppisistä).
Varmaankin tiesitte ko. suunnittelumallin salat, kunhan selvensin :).
Jos mulla on luokassa C seuraava tietorakenne ja sille käsittelymetodi:
private HashMap jotakin = new HashMap(); public void lisaaOtus(Integer id, A a) { jotakin.put(id, a); }
Eli lisätään HashMappiin olioita yliluokan tyyppisinä - vaikka ne siis ovat kuitenkin B- tai C-luokan ilmentymiä.
Tässä ei ole mitään ongelmaa (ilmeisesti).
Kun nyt tuohon HashMappiin lisätään tarpeeksi paljon (mielivaltainen määrä) olioita, hierarkiasta voi tulla vaikka kuinka syvä.
. . . // id-muuttujassa aina eri arvo c.lisaaOtus(new Integer(id), b); c.lisaaOtus(new Integer(id), c1); c1.lisaaotus(new Integer(id), b1); . . .
Miten siis saisin käytyä läpi tuon koko hierarkian ylhäältä alas? Yliluokan tyyppisenä luonnollisesti. Ilmeisesti iteraattori olisi paikallaan... Mutta miten se pitäisi tehdä?
Jos vaikka noissa B- ja C-luokassa on omat tulosta()-metodit ja niitä sitten kutsuttaisiin aina, kun HashMappia iteroidaan. Metodi palauttaisi halutulla tunnuksella löytyneen olion viitteen, joten siihen pääsisi sitten käsiksi luokan ulkopuolella.
Avusta ollaan kiitollisia...
Eipä enää mittään.
Aihe on jo aika vanha, joten et voi enää vastata siihen.