Java-ohjelmointi, syksy 2000. Arvosteluperusteet, tehtävä 2. Antti Vähäkangas Alikohtien (2,3) arvosteluperusteet mukaillen Jaakko Nurroa: Java-ohjelmointi, syksy 1999. Tehtävä 3. Jaakko Nurro Ensimmäinen kohta: 1) Private-näkyvyysmääreellä varustetut kentät / metodit eivät näy luokasta ulkopuolelle (eivät edes aliluokilleen ilmauksella super.kenttä). (1p) 2) Public-näkyvyysmääreellä varustetut metodit / kentät näkyvät "maailmalle", ts. ei rajoituksia näkyysalueeseen. (1p) 3) Kapseloinnin / abstraktin tietotyypin idea selitetty: julkisilla metodeilla käytetään "konetta". Yksityistä kalustoa ("koneen sisuksia") ja sen toimintaa ei tarvitse tietää. (0,5p) 4) Operaatioilla ei voi saattaa oliota epämieluisaan tilaan (lähinnä kapseloinnista / ADT:sta saatava hyötynäkökulma). (0,5p) 5) Static-määreellä varustettu metodi/muuttuja luokkakohtainen. Ilmentymät jakavat saman muuttujan. (0,5p) 6) Static-määreellä varustetun kentän/metodin käyttöön ei tarvita ilmentymää (kenttää voi käyttää myös ilmentymämetodin kautta). (0,5p) 7) Ei-static ilmentymäkohtainen metodi/kenttä. Ilmentymillä "omat" kopiot kentistä. (0,5p) 8) Ei-staattisen kentän käyttö vain ei-staattisen, ilmentymämetodin kautta (ilmentymäkohtaista kalustoa ei ole olemassa ennenkuin olio konstruoidaan) (0,5p) 9) Yhdistelmien selvitys: -private static Piilotetut luokkamuuttujat ja metodit. -public static Julkiset luokanmuuttujat ja metodit; pääohjelmametodi; kirjastoluokan metodit ja vakiot, esim. Math.PI -private Ilmentymien omat apumetodit. -public Julkiset konstruktorit ja aksessorit. (0,5p kukin kohta, yhteensä 2p) --- yht. (1) 7p Toinen kohta: Toisessa kohdassa katsoin oliko vastattu seuraaviin kysymyksiin: - Miten voit luoda ilmentymän luokasta L1 (parametrin tyyppi abstrakti luokka)? - Vastaus: antamalla parametriksi viitteen abstraktin luokan ei-abstraktin aliluokan ilmentymään. (1 piste) ------------- - Miksi kukaan haluaisi ohjelmoida abstraktia luokkaa? - Vastaus: (Wikla) Abstrakteja luokkia voi käyttää ns. public interfacen toteuttamiseen, jonkin luokan julkinen, käyttäjälle tarkoitettu kalusto määritellään erillisenä abstraktina luokkana ilman metodien toteutusta. Luokka joka metodit toteuttaa, jää käyttäjältä piiloon. Tämän muotoista vastausta harva kuitenkaan keksi, joten hyväksyin huomiot yleisestä luokasta, joka toimii polymorfismin kautta ulkoisena rajapintana konkreettisille aliluokilleen. Tämän eksplisiittisesta ja selkeästä selittämisestä sai 2 pistettä, vajaammista ja epäselvemmistä yhden. Pelkkä valottava esimerkki, josta ymmärsi vastaajan ymmärtäneen, riitti parhaimmillaan kahteen pisteeseen. - Entä jos T1 on rajapintaluokka? - Vastaus: Konstruktori tarvitsee parametrikseen ilmentymän luokasta, joka toteuttaa (implements) T1-rajapintaluokan. (1 piste) - Mihin rajapintaluokkaa käytetään? - Vastaus: ks. public interface yltä. Rajapintaluokka tarjoaa lisää tyyppimääreitä luokalle sen yliluokkien lisäksi, sillä rajapinnan toteuttavaa luokka voidaan käyttää rajapintaluokan ilmentymänä. Täten saadaan joidenkin kielten moniperinnän polymorfismiominaisuudet käyttöön, mutta ei tule ongelmaa päällekäin periytyvästä aineksesta. Rajapintaluokkaa voidaan käyttää siis yhdistämään myös luokkia, jotka eivät ole saman luokan aliluokkia Kohdasta saattoi saada kaksi pistettä, jos osasi kertoa tuon. Epämääräiset viittaukset sopimukseen metodien toteuttamisesta herättivät kysymyksen miksi tehdä tällainen sopimus, ja vihjailut moniperinnästä taas miten rajapintaluokan käyttö on javan vastine moniperinnälle. Moniperintää ei tarvinnut edes mainita, jotta sai pisteen, jos osasi selittää asian muuten. Esimerkit kävivät tähän myös. --- yht. (2) 6p Kolmas kohta: Vain yksi versio käyttöön: -------------------------- samassa pakkauksessa oleva versio: ei importtia - oletuksena käytössä. omapakkaus: "import omapakkaus.L3;" java.lang: "import java.lang.L3;" Useampia versioita käytössä: ---------------------------- Samassa pakkauksessa oleva versio: "L3.metodi();" omapakkaus: "omapakkaus.L3.metodi();" java.lang: java.lang.L3.metodi();" Kukin kohta oli pisteen arvoinen. Ilmaus 'import pakkaus.luokka;' tuo luokan eksplisiittisesti käyttöön, jolloin siihen voi viitata vastedes pelkällä luokannimellä. Yhdessä käännösyksikössä voi kuitenkin yhdellä nimellä viitata vain yhteen luokkaan kerrallaan, kahden samannimisen luokan eksplisiittinen tuominen aiheuttaa käännösaikaisen virheen. Implisiittinen 'import pakkaus.*' ei ole tehtävässä erityisen hyödyllinen, sillä K1:n kanssa samassa pakkauksessa oleva L3:n versio asettuu sen edelle. Tämän importin mainitseminen ei ollut mikään synti, kunhan eilaskettu sen varaan mitään. K1:n kanssa samassa pakkauksessa oleva L3 on käytössä pelkällä luokkanimellä, ellei sen edelle eksplisiittisesti tuoda jotain muuta luokkaa. --- yht. (3) 6p ------- yht. (1+2+3) 19p