Kaikissa tehtävissä ei ole yhtä oikeaa vastausta -- tärkeää on pohdinta ja yrittäminen. Jos et ole käyttänyt Javaa, voit ohjelmoida tehtäviin vastauksia myös muilla kielillä. Jos ohjelmointitaitosi ovat ruosteessa, harjoittelu on tie onneen. Jos et saa ohjelmiasi toimimaan, voit myös kuvailla sanallisesti niiden toiminnan.
Tarkoitus on, että teet tehtävät etukäteen ennen laskuharjoitustilaisuutta.
public void lypsa(Lehma lypsettava) { // ... double maitoa = lypsettava.lypsa(); sailio.lisaaSailioon(maitoa); } public void lypsa(JokuMuu lypsettava) { // ... double maitoa = lypsettava.lypsa(); sailio.lisaaSailioon(maitoa); }Tämä periaate kannattaa myös pitää mielessä kun käyttää Javan säiliöluokkia (esim ArrayList, ...). Itseasiassa tärkeää säiliöluokkien suhteen ovat juuri niiden toteuttamat rajapinnat, käyttäjän kannalta säiliöluokan sijainnilla perintähierarkiassa ei ole mitään merkitystä
1. Maatila maatila = new Maatila("Esko", new Navetta(new Maitosailio())); 2. // voit ajatella edellisen sekvenssikaaviossa seuraavanlaiseksi: 3. // Maitosailio maitosailio = new Maitosailio(); 4. // Navetta navetta = new Navetta(maitosailio); 5. // Maatila maatila = new Maatila( navetta ); 6. 7. Lypsyrobotti robo = new Lypsyrobotti(); 8. maatila.asennaNavettaanLypsyrobootti(robo); 9. 10. Lehma lehma1 = new Lehma(); 11. Lehma lehma2 = new Lehma(); 12. Lehma lehma3 = new Lehma(); 13. 14. maatila.lisaaLehma(lehma1); 15. maatila.lisaaLehma(lehma2); 16. 17. maatila.eleleTunti(); 18. maatila.hoidaLehmat(); 19. 20. System.out.println(maatila);
Maidon elämää-ohjelman lähdekoodit:
public interface Eleleva { public void eleleTunti(); } public interface Lypsava { public double lypsa(); } public class Maitosailio { private double tilavuus; private double saldo; public Maitosailio() { this(2000); } public Maitosailio(double tilavuus) { this.tilavuus = tilavuus; } public double getTilavuus() { return tilavuus; } public double getSaldo() { return saldo; } public double paljonkoTilaaJaljella() { return tilavuus-saldo; } public double otaSailiosta(double maara) { if ( maara>getSaldo() ) maara = getSaldo(); saldo -= maara; return maara; } public void lisaaSailioon(double maara) { if ( maara > paljonkoTilaaJaljella() ) maara = paljonkoTilaaJaljella(); saldo += maara; } @Override public String toString() { return Math.ceil( getSaldo() )+"/"+ Math.ceil( getTilavuus() ); } } public class Lehma implements Lypsava, Eleleva { private static String[] NIMIA = new String[]{ "Anu", "Arpa", "Essi", "Heluna", "Hely", "Hento", "Hilke", "Hilsu", "Hymy", "Ilme", "Ilo", "Jaana", "Jami", "Jatta", "Laku", "Liekki", "Mainikki", "Matti", "Mella", "Mimmi", "Naatti", "Nina", "Nyytti", "Papu", "Pullukka", "Pulu", "Rima", "Soma", "Sylkki", "Valpu", "Virpi"}; private String nimi; private double utareidenTilavuus; private double maitoaValmiina; public Lehma(String nimi) { this.nimi = nimi; utareidenTilavuus = 15+(int)(Math.random()*25); maitoaValmiina = 0; } public Lehma() { this( NIMIA[ (int)(Math.random()*NIMIA.length)] ); } public double lypsa() { double lypsettyMaara = maitoaValmiina; maitoaValmiina = 0; return lypsettyMaara; } public void eleleTunti() { double lisaMaito = 0.7+Math.random()*1.3; maitoaValmiina += lisaMaito; if ( maitoaValmiina>utareidenTilavuus ) maitoaValmiina = utareidenTilavuus; } @Override public String toString() { return nimiTasattuna() + pyorista(maitoaValmiina)+"/"+pyorista(utareidenTilavuus); } private String pyorista(double luku) { return String.format("%.1f", luku); } private String nimiTasattuna() { return String.format("%-10s",nimi); } } public class Lypsyrobotti { private Maitosailio sailio; public void lypsa(Lypsava lypsettava) { if ( sailio==null ) { System.out.println("Ei kiinnitetty maitosäiliöön, ei voida lypsää."); return; } double maitoa = lypsettava.lypsa(); sailio.lisaaSailioon(maitoa); } public void setMaitosailio(Maitosailio sailio) { this.sailio = sailio; } } public class Navetta { private Maitosailio sailio; private Lypsyrobotti robootti; public Navetta(Maitosailio maitosailio) { sailio = maitosailio; } public void hoida(Lehma ammu) { robootti.lypsa(ammu); } public void asennaLypsyrobotti(Lypsyrobotti robo) { this.robootti = robo;; robootti.setMaitosailio(sailio); } public void hoida(ListlehmaLista) { for ( Lehma lehma : lehmaLista ) hoida(lehma); } @Override public String toString() { return sailio.toString(); } } public class Maatila implements Eleleva { private String omistaja; private Navetta navetta; private List lehmat; public Maatila(String omistaja, Navetta navetta) { this.omistaja = omistaja; this.navetta = navetta; this.lehmat = new ArrayList (); } @Override public String toString() { String tulostus = "Maatilan omistaja: "+omistaja + "\n" + "Navetan maitosäiliö "+navetta.toString() +"\n"; if ( lehmat.isEmpty() ) tulostus += "Ei lehmiä."; else { String lehmajono = ""; for ( Lehma lehma :lehmat ) lehmajono += " "+lehma + "\n"; lehmajono.substring(0, lehmajono.length()-1); tulostus += "\n"+lehmajono; } return tulostus; } public void lisaaLehma(Lehma lehma) { lehmat.add(lehma); } public void eleleTunti() { for ( Lehma lehma : lehmat ) lehma.eleleTunti(); } public void hoidaLehmat() { navetta.hoida(lehmat); } public void asennaNavettaanLypsyrobootti(Lypsyrobotti robo) { navetta.asennaLypsyrobotti(robo); } }