From: Olli Jokinen 12.7.2004 ------------------------------------------------------ Tehtävä 1 - Basilisko + TuplaBasilisko a) Basilisko 9p - määrittelyt 2p * private static int yksilöllisyyslaskuri * private final int yksilöllisyys - konstruktori 2p * yksilöllisyysmuuttujan asetus - public String mikäOnPerimä() 1p - public Basilisko pariudu(Basilisko toinen) 3p - public String toString() 1p * palauttaa Stringin, ei esim käytä System.out.println()-metodia! b) TuplaBasilisko 9p - määrittely 2p * extends Basilisko * ei muuttujia - konstruktori 3p * konstruktori ON määriteltävä, koska yläluokasta puuttuu tyhjä konstruktori! - public TuplaBasilisko pariudu(TuplaBasilisko toinen) 4p * viitattu yläluokan private-kenttiin -2p Esimerkkikoodit: public class Basilisko { private String perimä; private static int yksilöllisyyslaskuri = 1; private final int YKSILÖLLISYYS; public Basilisko(String perimä) { this.YKSILÖLLISYYS = yksilöllisyyslaskuri; yksilöllisyyslaskuri++; this.perimä = perimä; } public String mikäOnPerimä() { return this.perimä; } public Basilisko pariudu(Basilisko toinen) { if (Math.random() < 0.5) { return new Basilisko(this.mikäOnPerimä()); } else { return new Basilisko(toinen.mikäOnPerimä()); } } public String toString() { return "("+this.YKSILÖLLISYYS+"): "+this.perimä; } } public class TuplaBasilisko extends Basilisko { /** * Yläluokalle ei ole määritelty tyhjää konstruktoria, joten * aliluokassa on määriteltävä ainakin yksi konstruktori (kts. * kurssimateriaali "4.4 Periytyminen")! */ public TuplaBasilisko(String perimä) { super(perimä); } public TuplaBasilisko pariudu(TuplaBasilisko toinen) { return new TuplaBasilisko(this.mikäOnPerimä() + toinen.mikäOnPerimä()); } } -------------------------------------------------------------------------------- Tehtävä 2 - abstraktit luokat ja rajapinnat Yleinen idea 4p - miksi käytetään - voidaan käyttää tyyppimääreenä (jolloin vaan ko abstraktin luokan/rajapinnan metodit ovat käytössä) Abstraktit luokat 5p - ei voi luoda ilmentymiä - jättää metodien toteutuksen aliluokan tehtäväksi - voi sisältää myös toimivaa kalustoa abstraktien metodien(/kenttien) lisäksi - aliluokan täytyy toteuttaa kaikki abstraktit metodit Rajapinnat 5p - lueteltu metodeita, jotka toteuttava luokka lupaa toteuttaa - luokka voi toteuttaa useamman rajapinnan - ei peritä Valaisevat esimerkit 3p -------------------------------------------------------------------------------- Tehtävä 3 - Rivitiedosto a) 12p - määrittelyt 2p * kunnossa-boolean tms puuttuu ja "rikkinäistä" tiedostoa yritetään lukea aina uudestaan -1p - konstruktori 3p - public String lueRivi() 7p * Merkkitiedosto luodaan aina uudestaan, kun lueRivi()-metodia kutsutaan -4p * metodi palauttaa koko tiedoston, ei yksittäisiä rivejä -4p b) 5p Esimerkkikoodi: public class Rivitiedosto { private Merkkitiedosto merkkiTiedosto; private boolean kunnossa = true; public Rivitiedosto(String tiedostonNimi) { try { this.merkkiTiedosto = new Merkkitiedosto(tiedostonNimi); } catch(Exception e) { this.kunnossa = false; } } public String lueRivi() { if(!this.kunnossa) { return null; } char apu = ' '; String jono = ""; do { try { apu = this.merkkiTiedosto.lueMerkki(); if(apu != '\n' && apu != '\u0000') { jono += apu; } } catch(Exception e) { this.kunnossa = false; return null; } } while(apu != '\n' && apu != '\u0000'); if(apu == '\u0000') { this.kunnossa = false; } return jono; } public static void main(String[] args) { int rivilaskuri = 0; System.out.println("Anna tiedoston nimi: "); Rivitiedosto apu = new Rivitiedosto(Lue.rivi()); while(apu.lueRivi() != null) { rivilaskuri++; } System.out.println("Tiedostossa oli "+rivilaskuri+" rivi(ä)."); } }